2010-05-03 6 views
19

Je m'intéresse particulièrement aux techniques Scala (2.8) pour construire des chaînes avec des formats ainsi que des façons intéressantes de faire un tel capacité facilement accessible où il est utile (listes d'octets, String, ...?) ..Quelle (s) manière (s) Scala (s) implémente cette classe Java "byte [] to Hex"

public class Hex { 
    public static String valueOf (final byte buf[]) { 
    if (null == buf) { 
     return null; 
    } 
    final StringBuilder sb = new StringBuilder(buf.length * 2); 
    for (final byte b : buf) { 
     sb.append(String.format("%02X", b & 0xff)); 
    } 
    return sb.toString(); 
    } 

    public static String valueOf (final Byteable o) { 
    return valueOf(o.toByteArray()); 
    } 
} 

Ceci est seulement un exercice d'apprentissage (donc l'utilité et la mise en œuvre de Java ne sont pas une préoccupation.)

Merci

Répondre

51

Cela ne gère pas null de la même manière que votre code.

object Hex { 

    def valueOf(buf: Array[Byte]): String = buf.map("%02X" format _).mkString 

    def valueOf(o: Byteable): String = valueOf(o.toByteArray) 

} 

Si vous voulez être en mesure de gérer null possibly- tableaux, vous pourriez être mieux faire que d'appeler le code et faire:

val bytes: Array[Byte] = // something, possibly null 
val string: Option[String] = Option(bytes).map(Hex.valueOf) 
+2

Je suis incapable de trouver 'Byteable' dans Scala. Quelle importation dois-je utiliser? –

+1

@MatteoGuarnerio dans la question, pas la bibliothèque standard –

5

Vous devez utiliser le type d'environnement Option de Scala pas de null. (Ceci est testé avec Scala 2.8.0.RC1)

object Hex { 
    def valueOf (buf: Array[Byte]) = { 
    if (null == buf) { 
     None 
    } else { 
     val sb = new StringBuilder(buf.length * 2) 
     for (b <- buf) { 
     sb.append("%02X".format(b & 0xff)) 
     } 
     Some(sb.toString()) 
    } 
    } 
    /* 
    def valueOf(o: Byteable) = { 
    return valueOf(o.toByteArray()); 
    } 
    */ 
} 

println(Hex.valueOf(Array(-3, -2, -1, 0, 1, 2, 3))) 
println(Hex.valueOf(null)) 
+2

Je me sens dans le code scala pure, vous devez juste supposer que buf n'est jamais nulle et en faire la responsabilité des appelants. Si vous utilisez toujours Option au lieu de valeurs null-able, ce problème disparaît gracieusement. Le seul problème est le code pour lequel java-interop est requis. –

9

Peut-être il y a des façons plus élégantes, mais quelque chose comme:

def valueOf(bytes : List[Byte]) = bytes.map{ 
    b => String.format("%02X", new java.lang.Integer(b & 0xff)) 
}.mkString 

devrait fonctionner.

Questions connexes