java 8:如何流式传输int数组,提取低字节,并创建一个byte数组

时间:2017-03-17 21:59:00

标签: java java-stream

要连接两个库,我需要将保存字节的int []数组转换为只有低字节的byte []数组。 (我需要用0xFF掩盖整数并将它们存储在byte []数组中。)我只能找到在转换int的所有4个字节时如何执行此操作的示例,这是我不需要的。

作为一项练习,我希望在纯Java 8中使用简短而有效的东西(即没有外部库,调用或SOUP的有效Java 8代码)。我尝试使用流,但无法找到有效的地图();例如:

byte[] mybytarray = Arrays.asList(myintarray).stream().map(v -> v & 0xFF).collect(toList()).toArray(byte[]::new);

但是有错误"无法推断地图的类型参数(功能)"我不明白如何写地图。

2 个答案:

答案 0 :(得分:3)

不幸的是,蒸汽不直接支持byte类型;即,。 ByteStreamint 1 没有long专门化。

如果你坚持使用流,一个合理有效的解决方案是使用ByteArrayOutputStream来收集字节:

ByteArrayOutputStream baos(myintarray.length);
Arrays.stream(myintarray).forEachOrdered(i -> baos.write((byte)i));
byte[] byteArray = baos.toArray();

这只复制一次数组。 for循环和显式数组插入会更好:

byte[] byteArray = new byte[myintarray.length];
for (int i = 0; i < myintarray.length; i++) {
  byteArray[i] = (byte)myintarray[i];
}

可能比流版本更简洁一些,并且速度与Java相同。

如果真的坚持使用Stream的1-liner ,您可以获得Byte[]而不是byte[],如下所示:

Arrays.stream(myintarray).boxed().map(Integer::byteValue)
    .collect(Collectors.toList()).toArray(new Byte[myintarray.length]);

这涉及到一堆拳击,你最终得到一个更大更慢的Byte[],但是嘿,你使用的是纯Java 8 解决方案,对吗?

尽管

1 组合爆炸论点,但鉴于byte[]在许多输入/输出导向中的关键性质,这对我来说似乎总是一个遗憾的遗漏操作

答案 1 :(得分:0)

Create a byte array with the same size as the int array, and let an index counter run from 0 to the size of the byte array - 1. Get the int value at the index counter and calculate the byte value you need and store it at the same index counter.