提问人:Eugene Shevchugov 提问时间:1/13/2021 最后编辑:Eugene Shevchugov 更新时间:1/13/2021 访问量:105
Java 中的联合流 [已关闭]
Union Streams in Java [closed]
问:
我认为这个问题是无用的,但我找不到如何将这段代码合并为一行
我有活跃的快递员名单。 我正在尝试在此列表中找到所有免费快递员,然后找到最小距离的快递员
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();
多谢!
答:
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)));
评论
CourierFinder.minDistanceUsingCourier
afterCheckIsFree