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

时间:2015-01-07 01:49:45

标签: java arrays java-8 java-stream

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();
}

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

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

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

2 个答案:

答案 0 :(得分:20)

 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());

答案 1 :(得分:10)

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

(可以很容易地将其更改为从int获取ByteBuffer,即4个字节到int。)

对于InputStream,如果您想急切地使用它,只需将其读入byte[]并使用上述内容即可。如果你想懒惰地使用它,你可以使用InputStream作为InputStream::read(加上异常处理)生成无限Consumer,并在你到达结束时结束它流。

关于

  

但由于复制了源

,两者都不是很有用

我不知道为什么会让它失去功能。

也相关