我尝试过滤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或更高版本的新闻吗?
答案 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中进行了检查异常处理,因此更为冗长,但它也具有一些优点:它不会对byte
到Byte
进行任何装箱操作,并且不会创建不必要的变量。
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,...]