Java 中的联合流 [已关闭]

Union Streams in Java [closed]

提问人:Eugene Shevchugov 提问时间:1/13/2021 最后编辑:Eugene Shevchugov 更新时间:1/13/2021 访问量:105

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

2年前关闭。

我认为这个问题是无用的,但我找不到如何将这段代码合并为一行

我有活跃的快递员名单。 我正在尝试在此列表中找到所有免费快递员,然后找到最小距离的快递员

List<Courier> afterCheckIsFree = activeCouriers.stream().filter(Courier::isFree).collect(Collectors.toList());
final Optional<Courier> courierWithMinDistance = afterCheckIsFree.stream()
                .filter(n -> n.getId().equals(CourierFinder.minDistanceUsingCourier(Point.ZERO_POINT, afterCheckIsFree).getId())).findFirst();

多谢!

Java 集合 lightweight-stream-api

评论

0赞 rzwitserloot 1/13/2021
几乎可以肯定可以做到,但您的问题并没有解释这些方法的作用。您是否正在尝试找到第一个具有最小距离的免费快递员?
0赞 Eugene Shevchugov 1/13/2021
是的,你是对的
0赞 Matt 1/13/2021
如果不了解内部的含义,就无法回答您的问题。CourierFinder.minDistanceUsingCourierafterCheckIsFree

答:

0赞 stinger 1/13/2021 #1

您应该在流中应用 2 个标准:首先,检查快递员是否免费,其次,按距离对剩余的快递员进行排序并排在第一位。 它如下所示:

list.stream().filter(Courier::isFree).sorted((c1, c2)->c1.getDistance().
                               compareTo(c2.getDistance())).
                               findFirst();
0赞 rzwitserloot 1/13/2021 #2

假设实际目标是找到既免费又距离最小的快递员......

您的代码将为每个快递员运行算法,因此效率非常低。它可以一次性完成:minDistance

Optional<Courier> = activeCouriers.stream()
  .filter(Courier::isFree)
  .min((c1, c2) -> c1.getDistanceFrom(ZERO_POINT) - c2.getDistanceFrom(ZERO_POINT));

min可以根据您想要的任何函数在流中找到最小的东西,这就是这里使用的。

1赞 Bohemian 1/13/2021 #3

更改方法以返回单个快递员的距离(而不是快递员列表的最小距离),然后:minDistanceUsingCourier

final Optional<Courier> courierWithMinDistance = activeCouriers.stream()
  .filter(Courier::isFree)
  .min(comparing(c -> minDistanceUsingCourier(Point.ZERO_POINT, c)));