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

非常感谢!

4

3 回答 3

1

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

final Optional<Courier> courierWithMinDistance = activeCouriers.stream()
  .filter(Courier::isFree)
  .min(comparing(c -> minDistanceUsingCourier(Point.ZERO_POINT, c)));
于 2021-01-13T07:47:22.840 回答
0

您应该在您的流上应用 2 个标准:首先,检查快递是否免费,其次,按距离对剩余的快递员进行排序并优先取走。它看起来像:

list.stream().filter(Courier::isFree).sorted((c1, c2)->c1.getDistance().
                               compareTo(c2.getDistance())).
                               findFirst();
于 2021-01-13T07:44:11.433 回答
0

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

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

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

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

于 2021-01-13T07:46:05.203 回答