将Object []从流转换为字节[]

时间:2018-07-06 18:11:29

标签: java java-8 java-stream

我尝试过滤byte[],我想从流中删除换行符

byte[] data = "y\neahbabydoit\nsothisistheway\ntodoit".getBytes();
Object[] tmp = IntStream.range(0, data.length).mapToObj(idx -> Integer.valueOf(data[idx]).byteValue()).filter(i -> i != 10).toArray();
System.out.println("src:"+Arrays.toString(data));
System.out.println("dst:"+Arrays.toString(tmp));

//works not!!
byte[] dest = (Byte[]) tmp; //help me here

结果(按预期)有效(到目前为止),但我无法以简单的方式将结果(Object[])转换回(byte[])...

  

src:[121、10、101、97、104、98,...
  dst:[121,101,97,104,98,97,...

我知道有解决此问题的方法(请参阅How to convert int[] to byte[]),但我想以一种简单(类似于流)的方式来实现它...

有关Java 8或更高版本的新闻吗?

3 个答案:

答案 0 :(得分:2)

为了避免处理多字节字符的麻烦,仅处理字符流可能会容易得多:

String result =
    data.chars()
        .filter(c -> c != '\n')
        .mapToObj(c -> String.valueOf((char) c))
        .collect(Collectors.joining());

答案 1 :(得分:2)

正如@Mureinik所建议的那样,最好处理字符而不是字节,要回答您的问题,您当然可以使用类似

Byte[] tmp = IntStream.range(0, data.length)
        .mapToObj(idx -> Integer.valueOf(data[idx]).byteValue())
        .filter(i -> i != 10)
        .toArray(Byte[]::new);

答案 2 :(得分:2)

使用Java 8收集字节数组不是很容易。
但是通过在收集操作中使用ByteArrayOutputStream::new作为供应商,您可以。
由于合并器的原因,它在主体lambda中进行了检查异常处理,因此更为冗长,但它也具有一些优点:它不会对byteByte进行任何装箱操作,并且不会创建不必要的变量。

byte[] data = "y\neahbabydoit\nsothisistheway\ntodoit".getBytes();
byte[] dest = IntStream.range(0, data.length)
                       .map(i -> data[i])
                       .filter(i -> i != 10)
                       .collect(ByteArrayOutputStream::new, ByteArrayOutputStream::write, (bos1, bos2) -> {
                           try {
                               bos2.writeTo(bos1);
                           } catch (IOException e) {
                              throw new RuntimeException(e);
                           }
                       })
                       .toByteArray();

System.out.println("src:" + Arrays.toString(data));
System.out.println("dst:" + Arrays.toString(dest));

输出:

  

src:[121,10,101,97,104,98,97,98,121,...]

     

dst:[121,101,97,104,98,97,98,121,...]