理解累加器的归约操作 - java 8

use*_*988 -1 java java-8

我试图了解减少累加器的操作:在下面的例子中

List<String> letters = Arrays.asList("a","bb","ccc");
String result123 = letters
  .stream()
  .reduce((partialString, element) -> 
      partialString.length() < element.length() 
      ? partialString
      : element
  ).get();  

System.out.println(result123);
Run Code Online (Sandbox Code Playgroud)

partialString 是否初始化为空字符串?由于它是一个折叠操作,我认为该操作应该导致空字符串但它的打印"a". 有人可以解释一下这个累加器是如何工作的吗?

azr*_*zro 6

for-loop用于相应的代码reduce操作是类似

boolean seen = false;
String acc = null;
for (String letter : letters) {
    if (!seen) {
        seen = true;
        acc = letter;
    } else {
        acc = acc.length() < letter.length() ? acc : letter;
    }
}
Run Code Online (Sandbox Code Playgroud)

要减少的第一对元素是(firstElt, secondElt),没有空的初始元素


如果您打印每一步 reduce

letters.stream()
       .reduce((partialString, element) -> {
           System.out.println(partialString + " " + element);
           return partialString.length() < element.length() ? partialString : element;
       }).get();

// output
a bb
a ccc
Run Code Online (Sandbox Code Playgroud)

  • 该操作*总是*返回一个`Optional&lt;String&gt;`,不仅当流为空时。 (2认同)

And*_*eas 6

如果您阅读文档,即 的 javadoc reduce(),您将了解到它partialString被初始化为第一个值,并且reduce()仅被调用来组合值,也就是减少它们。

是否partialString初始化为空字符串?

不。如果你想要,你需要使用 reduce()一种方法,所以你不需要调用get()

String result123 = letters
  .stream()
  .reduce("", (partialString, element) -> 
      partialString.length() < element.length() 
      ? partialString
      : element
  );
Run Code Online (Sandbox Code Playgroud)

当然,这没有任何意义,因为partialString现在总是一个带有 的字符串length() = 0,所以表达式的结果总是一个空字符串。您不妨编写String result123 = "";并保存所有 CPU 时间。