我有字符串和null的流
Stream<String> str1 = Stream.of("A","B","C",null,null,"D",null,"E","F",null,"G",null);
Run Code Online (Sandbox Code Playgroud)
我想将它减少到另一个流,其中任何非空字符串序列连接在一起,即喜欢
Stream<String> str2 = Stream.of("ABC", "", "D", "EF","G")
Run Code Online (Sandbox Code Playgroud)
第一种方式,我发现 - 创建收集器,首先将完整的输入流减少到单个对象,并列出所有连接的字符串,然后从中创建新的流:
class Acc1 {
final private List<String> data = new ArrayList<>();
final private StringBuilder sb = new StringBuilder();
private void accept(final String s) {
if (s != null)
sb.append(s);
else {
data.add(sb.toString());
sb.setLength(0);
}
}
public static Collector<String,Acc1,Stream<String>> collector() {
return Collector.of(Acc1::new, Acc1::accept, (a,b)-> a, acc -> acc.data.stream());
}
}
...
Stream<String> str2 = str.collect(Acc1.collector());
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,如果使用str2,即使作为str2.findFirst(),输入流也将被完全处理.消耗时间和内存的操作以及来自某些生成器的无限流,它根本不起作用
另一种方法 - 创建外部对象,保持中间状态并在flatMap()中使用它:
class Acc2 {
final private StringBuilder …Run Code Online (Sandbox Code Playgroud)