将字节数组转换为 IntStream 的最佳方法是什么?

2022-09-03 00:07:19

Java 8 具有 java.util.stream.Stream 和 java.util.stream.IntStream 类型。java.util.Arrays 有一个方法

IntStream is = Arrays.stream(int[])

但是没有这样的方法从byte[],short[]或char[]制作IntStream,将每个元素加宽为int。有没有一种习惯用语/首选方法从byte[]创建IntStream,这样我就可以以一种功能方式对字节数组进行操作?

当然,我可以简单地手动将byte[]转换为int[],并使用Arrays.stream(int[]),或者使用IntStream.Builder:

public static IntStream stream(byte[] bytes) {
   IntStream.Builder isb = IntStream.builder();
   for (byte b: bytes) 
       isb.add((int) b); 
   return isb.build();
}

但由于复制源,两者都不是很实用。

似乎也没有一种简单的方法可以将输入流(或在本例中为ByteArrayInputStream)转换为IntStream,这对于在功能上处理输入流非常有用。(明显的遗漏?

有没有一种功能更强大、高效且不复制的方法?


答案 1
 byte[] bytes = {2, 6, -2, 1, 7};
 IntStream is = IntStream.range(0, bytes.length).map(i -> bytes[i]);

 ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
 IntStream is2 = IntStream.generate(inputStream::read).limit(inputStream.available());

答案 2
public static IntStream stream(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.wrap(bytes);
    return IntStream.generate(buffer::get).limit(buffer.remaining());
}

(这可以很容易地从, 即 4 个字节转换为 .)intByteBufferint

对于 ,如果你想热切地消费它,只需把它读成 a 并使用上面的内容。如果你想懒惰地使用它,你可以生成一个无限的use作为(加上异常处理),并在到达流的末尾时结束它。InputStreambyte[]InputStreamInputStream::readConsumer

关于

但由于复制源,两者都不是很实用

我不明白为什么这会使它不起作用。

也相关