gpt4 book ai didi

java 8 : how to stream an array of int, 提取低字节,并创建一个字节数组

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:35:48 25 4
gpt4 key购买 nike

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

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

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

但是出现错误“无法推断映射(函数)的类型参数”,我不明白如何编写映射。

最佳答案

很遗憾,steam 不直接支持byte 类型; IE,。没有像 intlong1 那样的 ByteStream 特化。

如果您坚持使用流,一个相当有效的解决方案是使用 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];
}

可能比 streams 版本更简洁,而且速度与您在 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[] 的关键性质,这对我来说总是一个不幸的遗漏许多面向输入/输出的操作。

关于java 8 : how to stream an array of int, 提取低字节,并创建一个字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com