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非常有用。 (明显遗漏?)
是否有更有效且不复制的功能方式?
答案 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
,并在你到达结束时结束它流。
关于
但由于复制了源
,两者都不是很有用
我不知道为什么会让它失去功能。
也相关