小编rus*_*tot的帖子

如何正确地将流减少到另一个流

我有字符串和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)

java java-8 java-stream

4
推荐指数
2
解决办法
248
查看次数

标签 统计

java ×1

java-8 ×1

java-stream ×1