繁体   English   中英

创建一个从 byte[] 到原始字节 Stream 的 Stream

[英]Create a Stream from a byte[] to a primitive byte Stream

我有一个byte[]并且我想制作一个字节流。

对于int[]longdouble ,我在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM