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

What is the best way to convert a byte array to an IntStream?

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

IntStream is = Arrays.stream(int[])

但没有这样的方法从 byte[]、short[] 或 char[] 生成 IntStream,将每个元素扩展为 int。是否有 idiomatic/preferred 方法从 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();
}

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

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

有没有更实用的高效不抄袭的方式?

 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());
public static IntStream stream(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.wrap(bytes);
    return IntStream.generate(buffer::get).limit(buffer.remaining());
}

(这可以很容易地更改为从 ByteBuffer 中获取 ints,即 int 的 4 个字节。)

对于InputStream,如果你想急着消费,读成一个byte[]就可以了,用上面的就可以了。如果您想懒惰地使用它,您可以使用 InputStream::read 作为 Consumer(加上异常处理)生成一个无限的 InputStream 并在到达流的末尾时结束它。

有关

but neither is very functional due to the copying of the source

我不明白为什么它无法正常工作。

也相关

  • Why is String.chars() a stream of ints in Java 8?
  • Why are new java.util.Arrays methods in Java 8 not overloaded for all the primitive types?
  • Limit a stream by a predicate