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

时间:2014-11-28 03:14:56

标签: lambda hex java-8 java-stream

这是How can I make an IntStream from a byte array?

的后续问题

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

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());
}

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

1 个答案:

答案 0 :(得分:6)

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

虽然以下可能更有效:

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();
}

两者都支持并行处理。