将字节数组转换为 IntStream 的最佳方法是什么?
What is the best way to convert a byte array to an IntStream?
Java 8 有 java.util.stream.Stream 和 java.util.stream.IntStream 类型。 java.util.Arrays 有方法
IntStream is = Arrays.stream(int[])
但没有这样的方法从 byte[]、short[] 或 char[] 生成 IntStream,将每个元素扩展为 int。是否有 idiomatic/preferred 方法从 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
s,即 int
的 4 个字节。)
对于InputStream
,如果你想急着消费,读成一个byte[]
就可以了,用上面的就可以了。如果您想懒惰地使用它,您可以使用 InputStream::read
作为 Consumer
(加上异常处理)生成一个无限的 InputStream
并在到达流的末尾时结束它。
有关
but neither is very functional due to the copying of the source
我不明白为什么它无法正常工作。
也相关
- Why is String.chars() a stream of ints in Java 8?
- Why are new java.util.Arrays methods in Java 8 not overloaded for all the primitive types?
- Limit a stream by a predicate
Java 8 有 java.util.stream.Stream 和 java.util.stream.IntStream 类型。 java.util.Arrays 有方法
IntStream is = Arrays.stream(int[])
但没有这样的方法从 byte[]、short[] 或 char[] 生成 IntStream,将每个元素扩展为 int。是否有 idiomatic/preferred 方法从 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
s,即 int
的 4 个字节。)
对于InputStream
,如果你想急着消费,读成一个byte[]
就可以了,用上面的就可以了。如果您想懒惰地使用它,您可以使用 InputStream::read
作为 Consumer
(加上异常处理)生成一个无限的 InputStream
并在到达流的末尾时结束它。
有关
but neither is very functional due to the copying of the source
我不明白为什么它无法正常工作。
也相关
- Why is String.chars() a stream of ints in Java 8?
- Why are new java.util.Arrays methods in Java 8 not overloaded for all the primitive types?
- Limit a stream by a predicate