给定一个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));
}


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

最佳答案

这是流媒体版本

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


flatMap部分将所有Riders展平为AbstractMap.SimpleEntry,每个都包含一个Rider及其所属的Unicorn。然后,我们通过比较两个RiderrideTime获得最大条目。如果存在,我们创建ImmutablePair结果,否则将为Optional.empty

关于java - 如何使用流重写嵌套列表的查找功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53524333/

10-12 04:54