gpt4 book ai didi

java - 我可以使用 Java Stream Collector 来实现这种行为吗

转载 作者:行者123 更新时间:2023-11-29 07:28:00 26 4
gpt4 key购买 nike

我有一个包含以下代码的小方法:

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()
);
});

希望很明显,我正在做的是在处理流中的每个航类时累积指标。该代码确实有效,但我想知道是否有更好(功能更强大)的方法来实现此行为,可能使用收集器。感谢任何反馈。

谢谢,

-托尼

最佳答案

如果打印在forEach很重要,那么您当前的解决方案就很好。 forEach专为副作用而设计,并且您有两个副作用:将指标添加到 CarrierMetrics实例打印。

如果打印在forEach仅用于调试,并且不打算用于您的最终解决方案,那么一个更实用的实现是将结果直接收集到 CarrierMetrics 中实例,而不是先初始化实例并手动添加 forEach .您可以使用 collect(...) 的重载需要 3 个参数:

  • A Supplier<CarrierMetrics>创建初始 CarrierMetrics实例,它将用作累加器
  • A BiConsumer<CarrierMetrics, Flight>通过 Flight 累加器实例
    • 类型Flight只是根据您共享的代码进行的猜测。它是流的类型(也是 CarrierMetrics.addFlight 方法的参数类型)
  • A BiConsumer<CarrierMetrics, CarrierMetrics>在并行流的情况下组合多个累加器

像这样:

final int year = getYear();
final CarrierMetrics metrics = repository.getFlightStream(year)
.filter(flight -> flight.getCarrier().equals(carrier))
.collect(CarrierMetrics::new, CarrierMetrics::addFlight, (a1, a2) -> {});

第三个参数,组合器,是一个虚拟的,你需要解决这个问题。它的实现应该结合这两个 CarrierMetrics第一个参数。(我不能给出一个具体的例子,因为你没有分享足够的关于 CarrierMetrics 的细节来了解如何做。但是举个一些的例子,在 List 的情况下蓄能器,实现可以是 (a1, a2) -> a1.addAll(a2) .)

(最后,此示例假设 CarrierMetrics 具有无参数构造函数,以便 CarrierMetrics::new 引用起作用。如果没有这样的构造函数,可以使用合适的lambda表达式,比如() -> new CarrierMetrics(...) .)

关于java - 我可以使用 Java Stream Collector 来实现这种行为吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com