使用lambdas和流从字节数组中获取十六进制字符串的有效方法

Jin*_*won 1 lambda hex java-8 java-stream

这是如何从字节数组创建IntStream的后续问题

我创建了一个方法将给定的字节数组转换为连接的十六进制字符

static String bytesToHex(final byte[] bytes) {

    return IntStream.rang(0, bytes.length * 2)
        .map(i -> (bytes[i / 2] >> ((i & 0x01) == 0 ? 4 : 0)) & 0x0F)
        .mapToObj(Integer::toHexString)
        .collect(joining());
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,不使用任何第三方库,上面的代码是否足够有效?我做错了什么或不必要的吗?

Hol*_*ger 6

static String bytesToHex(final byte[] bytes) {
    return IntStream.range(0, bytes.length)
        .mapToObj(i->String.format("%02x", bytes[i]&0xff))
        .collect(joining());
}
Run Code Online (Sandbox Code Playgroud)

虽然以下可能更有效:

static String bytesToHex(final byte[] bytes) {
    return IntStream.range(0, bytes.length)
        .collect(StringBuilder::new,
                 (sb,i)->new Formatter(sb).format("%02x", bytes[i]&0xff),
                 StringBuilder::append).toString();
}
Run Code Online (Sandbox Code Playgroud)

两者都支持并行处理.