[英]Create a Stream from a byte[] to a primitive byte Stream
我有一个byte[]
并且我想制作一个字节流。
对于int[]
和long
和double
,我在 Arrays 类中看到了方法:
Arrays.stream(int[] array)
Arrays.stream(long[] array)
Arrays.stream(double[] array)
但是,我没有看到任何方法Arrays.stream(byte[] array)
。
那么获取字节原语流作为实际字节的最简单和最简洁的方法是什么?
我需要对 byte[] 进行转换,并且我需要一个字节流来使用所有 Stream 函数来完成它(不,我不想将它们全部转换为整数。)
谁有好的解决方案?
附注。 其他人正在为我提供来自微控制器 API 的 byte[] ......所以如果没有必要,我不想使用其他一些数据类型。
谢谢。
Stream<Byte>
与原语的 ByteStream 差不多,因为Byte#valueOf
返回装箱值的缓存实例(并且编译器为您处理装箱和拆箱)。 那么唯一的技巧就是将你的byte[]
变成Stream<Byte>
。
一种方法是创建一个IntStream
索引,然后将这些索引映射到您的byte[]
:
byte[] byteArray = "hello".getBytes();
Stream<Byte> byteStream = IntStream.range(0, byteArray.length)
.mapToObj(i -> byteArray[i]);
我不知道 JDK 中有任何帮助方法可以为您执行此操作。
你可以做这样的事情。
byte[] a = { 1, 2, 3, 4
};
byteStream(a).forEach(System.out::println);
public static IntStream byteStream(byte[] a) {
return IntStream.range(0, a.length).map(idx -> a[idx]);
}
public static byte[] toByteArray(IntStream b) {
Byte[] barray = b.map(a->a&0xFF).boxed().toArray(Byte[]::new);
byte[] ret = new byte[barray.length];
System.arraycopy(barray,0,ret,0,barray.length);
return ret;
}
否则您可能需要将 Steam 与 Byte 一起使用,因为 byte、float 和 short 的原始实现不存在。 我相信Guava
支持字节流。
你可以这样做
byte[] byteArray = "Hello World".getBytes();
Stream.Builder<Byte> builder = Stream.builder();
for (int i = 0; i < byteArray.length; i++) {
builder.add(byteArray[i]);
}
Stream<Byte> stream = builder.build();
stream.forEach(str -> System.out.print(str + " "));
/*for(Object b : stream.toArray()){
String a= new String(new byte[]{(byte)b});
System.out.println(a);
}*/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.