collectingAndThen
添加仅在集合末尾执行的单个操作。
So
String personWithMaxAge = persons.stream()
.collect(Collectors.collectingAndThen(
Collectors.maxBy(Comparator.comparing(Person::getAge)),
(Optional<Person> p) -> p.isPresent() ? p.get().getName() : "none"
));
与
Optional<Person> p = persons.stream()
.collect(Collectors.maxBy(Comparator.comparing(Person::getAge)));
String personWithMaxAge = p.isPresent() ? p.get().getName() : "none";
当您使用生成的收集器作为另一个收集器的输入时,例如,在收集器中指定操作的实际优势就会显现出来。groupingBy(f1, collectingAndThen(collector, f2))
.
由于这是最后仅执行一次的简单操作,因此不会对性能产生影响。此外,不太可能sorted
基于解决方案比maxBy
对任何重要输入的操作。
您只是使用了一个损坏的基准,违反了“中列出的几条规则”如何用 Java 编写正确的微基准测试?”。最值得注意的是,您正在测量 Stream 框架第一次使用的初始初始化开销。只需交换两个操作的顺序就会得到完全不同的结果。
不过,没有必要使操作变得不必要地复杂。如前所述,镜像现有 Stream 操作的收集器的优点是它们可以与其他收集器组合。如果不需要这样的组合,只需使用直接代码
String personWithMaxAge = persons.stream()
.max(Comparator.comparing(Person::getAge))
.map(Person::getName).orElse("none");
比 Collector 使用更简单,比 Collector 更高效sorted
基于解决方案。