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

djb*_*djb 14 java arrays java-8 java-stream

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

IntStream is = Arrays.stream(int[])
Run Code Online (Sandbox Code Playgroud)

但是没有这样的方法可以从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();
}
Run Code Online (Sandbox Code Playgroud)

但是由于复制了源代码,它们都不是很有用.

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

是否有更有效且不复制的功能方式?

Pau*_*ton 21

 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());
Run Code Online (Sandbox Code Playgroud)

  • 在`generate`中添加一个`limit`.否则它返回一个无限的"流". (3认同)
  • 将任意的`InputStream`转换为`IntStream`只是一个不同的问题.不仅因为"可用"合同不同,而且还因为检查了异常... (2认同)

Sot*_*lis 10

public static IntStream stream(byte[] bytes) {
    ByteBuffer buffer = ByteBuffer.wrap(bytes);
    return IntStream.generate(buffer::get).limit(buffer.remaining());
}
Run Code Online (Sandbox Code Playgroud)

(这可以很容易地改变为intByteBuffer,即4个字节到int.)

因为InputStream,如果你想急切地消费它,只需将其读入byte[]并使用上述内容即可.如果你想懒洋洋地使用它,你可以生成无限InputStream使用InputStream::readConsumer(加上异常处理),并结束它,当你到达流的末尾.

关于

但是由于复制了源代码,它们都不是很有用

我不明白为什么这会使它失去功能.

也相关