【发布时间】:2017-11-26 20:07:42
【问题描述】:
我有一个包含以下代码的小方法:
final int year = getYear();
final Carrier carrier = getCarrier();
final CarrierMetrics metrics = new CarrierMetrics(carrier);
repository.getFlightStream(year)
.filter(flight -> flight.getCarrier().equals(carrier))
.forEach(flight -> {
metrics.addFlight(flight);
printf("%,10d\t%,10d\t%,10d\t%,10d\r",
metrics.getTotalFlights(),
metrics.getTotalCancelled(),
metrics.getTotalDiverted(),
metrics.getAirports().size()
);
});
希望很明显,我正在做的是在处理流中的每个航班时累积指标。该代码确实有效,但我想知道是否有更好(更实用)的方法来实现此行为,可能使用收集器。感谢您提供任何反馈。
谢谢,
-托尼
【问题讨论】:
-
使用
Collector.of定义一个自定义收集器。 -
您的 peek().allMatch() 是一种非常复杂的 forEach() 方式。
-
是的,这就是收集器的工作。但是你也可以使用这个 collect() 方法:docs.oracle.com/javase/8/docs/api/java/util/stream/…
-
同意关于使用 forEach 而不是 peek 的评论。代码相应更新。
标签: java java-stream collectors