在收集流线之前先对其进行处理

Concat stream lines before collecting them

提问人:FSm 提问时间:10/16/2020 最后编辑:FSm 更新时间:10/16/2020 访问量:61

问:

简单地说,下面的代码生成了一个包含五行的流,我需要将这些行合并为一行(在流式传输时)以供进一步使用,然后再收集它们。代码即将将一个字符串转换为一个长二进制字符串

Stream<String> binText = "hello".chars()
    .mapToObj(x-> Integer.toBinaryString(x))
    .map(x-> String.format("%8s", x).replaceAll(" ", "0"));

我对“流 API”这个术语有点陌生,所以任何建议将不胜感激。

更新:假设我想将上述代码中的流映射到 of 和 中,实际上,我尝试了以下代码,它工作正常,但似乎效率低下,需要规范化int []01

int [] binText = "hello".chars()
                     .mapToObj(x-> Integer.toBinaryString(x))
                     .map(x-> String.format("%8s", x).replaceAll(" ", "0"))
                     .flatMap(s-> Stream.of(s.split("")))
                     .mapToInt(Integer::parseInt)
                     .toArray();   

不是吗?

java 函数式编程 轻量级流API

评论

0赞 Polygnome 10/16/2020
把它收集到一个中有什么问题?String
0赞 Eugene 10/16/2020
所以你想有一个等等?Stream<5Lines, 5Lines, 5Lines>
0赞 FSm 10/16/2020
@Eugene,只需连接线条,中间没有任何昏迷或空格。
1赞 Eugene 10/16/2020
你需要举个例子来说明你的意思,确切地说,这相当令人困惑:......在流式传输以供进一步使用时和收集它们之前..
0赞 FSm 10/16/2020
Polygnome,实际上,由于某些原因,我需要在收集之前合并行。

答:

1赞 Naman 10/16/2020 #1

你要找的是一个收集器来连接这些字符串,你会有

.collect(Collectors.joining())

最终,完整的解决方案可能是:

String binText = "hello".chars()
        .mapToObj(Integer::toBinaryString)
        .map(x-> String.format("%8s", x).replace(" ", "0"))
        .collect(Collectors.joining());

评论

1赞 Eugene 10/16/2020
我希望你是对的,OP说:......在收集它们之前。可能是他把术语弄错了
1赞 Polygnome 10/16/2020
@Eugene或.collect(Collectors.joining()).stream()...Collectors.collectingAndThen(...)
0赞 Naman 10/16/2020
@Eugene,是的,至少与期望有关,将字符串转换为一个长二进制字符串:)
0赞 FSm 10/16/2020
@Eungene,很高兴知道,非常感谢Collectors.collectingAndThen