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


Java 8 有 java.util.stream.Stream

和 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 方法没有针对所有基元类型重载?
  • 通过谓词限制流

相关内容

最新更新