如何使用流重写嵌套列表的查找功能

时间:2018-11-28 16:47:59

标签: java java-stream

给出一个List<Unicorn>,每个独角兽都包含一个List<Rider>,返回该独角兽和一部分骑手的最新骑手信息。

我这样写:

static Optional<ImmutablePair<Unicorn, Rider>> findLatestExperiencedRiderInfo(
        final List<Unicorn> unicorns) {

    Rider latestExperiencedRider = null;
    Unicorn unicornOfLatestExperiencedRider = null;
    long latestRideTime = 0L;

    for (final Unicorn unicorn : unicorns) {
        for (final Rider rider : unicorn.getRiders()) {
            if (rider.getType() == Rider.Type.EXPERIENCED) {
                final long time = rider.getRideTime();
                if (time > latestRideTime) {
                    latestRideTime = time;
                    latestExperiencedRider = rider;
                    unicornOfLatestExperiencedRider = unicorn;
                }
            }
        }
    }

    return latestExperiencedRider == null
            ? Optional.empty()
            : Optional.of(new ImmutablePair<>(
                    unicornOfLatestExperiencedRider,
                    latestExperiencedRider));
}

我希望有一个更简洁的版本,可能使用流(或者只是用不同的方式编写)。您有什么建议?

2 个答案:

答案 0 :(得分:3)

这是流版本

null

unicorns.stream() .flatMap(unicorn -> unicorn.getRiders() .stream() .filter(rider -> rider.getType() == Rider.Type.EXPERIENCED) .map(rider -> new AbstractMap.SimpleEntry<>(unicorn, rider))) .max(Comparator.comparingLong(entry -> entry.getValue().getRideTime())) .map(entry -> new ImmutablePair<>(entry.getKey(), entry.getValue())); 部分将所有Riders展平为flatMap,每个AbstractMap.SimpleEntry包含一个Rider及其所属的Unicorn。然后,我们通过比较两个Rider的{​​{1}}获得最大条目。如果存在,我们将创建ImmutablePair结果,否则将为rideTime

答案 1 :(得分:1)

也许是这样,您可以添加必需的null检查。

  {"Hello stack. I need help"|regex_replace:"/^(\w+\s)/":" "}

您还可以在// This is your rider.. final Optional<Rider> aRider = unicorns.stream() .flatMap(unicorn -> unicorn.getRiders().stream()) .filter(rider -> rider.type == Rider.Type.EXPERIENCED) .max(Comparator.comparingLong(Rider::getRideTime)); // This is your unicorn.. final Optional<Unicorn> any = unicorns.stream() .filter(unicorn -> unicorn.getRiders().contains(aRider.get())) .findAny(); 中保留对Unicorn的引用,因此一旦您有骑手,就无需搜索独角兽。