在stream.reduce之后是否有更优雅的方法来切断主角?

Vic*_*azi 2 reduce java-8 java-stream

是否有一种更优雅的方式来加入流的元素,用"\n"分隔每个元素,但不以"\n"开头,而不必像下面的例子那样进行子串(1)调用?

    List<String> strings = someList;

    String rval = strings.stream()
            .map(this::someOperation)
            .reduce("", (p1, p2) -> p1 + "\n" + p2);

    if(rval.length() > 0)
    {
        // trim off the leading "\n"
        rval = rval.substring(1);
    }
    return rval;
}
Run Code Online (Sandbox Code Playgroud)

当然我可以用内部循环替换它,但这会失去明显的功能可读性

JB *_*zet 6

使用

.collect(Collectors.joining("\n"))
Run Code Online (Sandbox Code Playgroud)

通过不创建大量临时字符串和副本,它将解决您的问题,更具可读性,并且更有效率.

  • 没问题.这种情况一直发生在并发系统中. (3认同)

Fed*_*ner 5

有特定的收集器可以有效地处理字符串.如果你看一下Collectors.joining,你会发现你所寻找的东西很简单:

String joined = strings.stream()
    .map(this::someOperation)
    .collect(Collectors.joining("\n"));
Run Code Online (Sandbox Code Playgroud)