要连接两个库,我需要将保存字节的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);
但是有错误"无法推断地图的类型参数(功能)"我不明白如何写地图。
答案 0 :(得分:3)
不幸的是,蒸汽不直接支持byte
类型;即,。 ByteStream
和int
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.