和 java.util.stream.IntStream types.java.util.Arrays 有一个方法
IntStream is = Arrays.stream(int[])
但没有这样的方法可以从字节[],短[]或字符[]创建IntStream,将每个元素扩大到一个整数。是否有一种惯用/首选的方法可以从 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
中获取int
秒,即 4 字节到int
。
对于InputStream
,如果您想急切地消费它,只需将其读入byte[]
并使用上述内容即可。如果要懒惰地使用它,可以使用InputStream::read
作为Consumer
(加上异常处理)生成无限InputStream
,并在到达流的末尾时结束它。
关于
但由于复制了源,两者都不是很实用
我不明白为什么这会使其不起作用。
也相关
- 为什么 String.chars() 是 Java 8 中的整数流?
- 为什么 Java 8 中新的 java.util.Arrays 方法没有针对所有基元类型重载?
- 通过谓词限制流