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)
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)
(这可以很容易地改变为int从ByteBuffer,即4个字节到int.)
因为InputStream,如果你想急切地消费它,只需将其读入byte[]并使用上述内容即可.如果你想懒洋洋地使用它,你可以生成无限InputStream使用InputStream::read的Consumer(加上异常处理),并结束它,当你到达流的末尾.
关于
但是由于复制了源代码,它们都不是很有用
我不明白为什么这会使它失去功能.
也相关
| 归档时间: |
|
| 查看次数: |
6932 次 |
| 最近记录: |