1.6 简单简化

1.6 简单简化

现在你已经知道了如何创建并转换一个流,我们最终也是最重要的一点就是从流的数据中得到我们想要得到的。我们在本节中介绍的方法就是简化。简化是终端的操作,它将流减少为非流值直到可以在程序中被使用。

你早已见到流的简化:count()方法返回了流中元素的数量。

其他的简化有 max() 和 min() 方法,它们返回流中最大值或者是最小值。有一种说法-这些方法返回一个Optional 值,该值可以包装答案或表明没有答案(因为流恰巧是空的)。在过去,这种情况通常返回 null,但是当程序未完全测试的时候,这样会导致空指针异常。Optional类型是指示缺少返回值的更好方法。 我们将在下一节中详细讨论Optional类型。 这是获取最大流的方法:

1
2
Optional<String> largest = words.max(String::compareToIgnoreCase);
System.out.println("largest: " + largest.orElse(""));

findFirst() 返回非空集合中的第一个值。 与过滤器结合使用时通常很有用。 例如,在这里找到以字母Q开头的第一个单词(如果存在):

1
2
Optional<String> startsWithQ
= words.filter(s -> s.startsWith("Q")).findFirst();

如果你需要匹配任何位置的元素,而不仅是匹配第一个元素,请使用findAny方法。 当并行化流时,此方法很有效,因为该流可以报告它找到的任何匹配项,而不必局限于第一个匹配项。

1
2
Optional<String> startsWithQ
= words.parallel().filter(s -> s.startsWith("Q")).findAny();

如果您只是想知道是否有匹配项,请使用anyMatch()。 该方法带有 predicate 参数,因此您无需使用filter。

1
2
boolean aWordStartsWithQ
= words.parallel().anyMatch(s -> s.startsWith("Q"));

如果所有元素都不匹配 predicate,则有allMatch()和noneMatch()返回true。 这些方法还受益于并行运行。

1
2
3
4
5
6
7
8
java.util.stream.Stream 8
Optional<T> max(Comparator<? super T> comparator)
• Optional<T> min(Comparator<? super T> comparator)
• Optional<T> findFirst()
• Optional<T> findAny()
boolean anyMatch(Predicate<? super T> predicate)
boolean allMatch(Predicate<? super T> predicate)
boolean noneMatch(Predicate<? super T> predicate)
坚持原创技术分享,您的支持将鼓励我继续创作!