代码之家  ›  专栏  ›  技术社区  ›  JRL

如何使用流重写嵌套列表的find函数

  •  1
  • JRL  · 技术社区  · 7 年前

    给予 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));
    }
    

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

    2 回复  |  直到 7 年前
        1
  •  3
  •   Thiyagu    7 年前

    这是一个流版本

    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 部分将所有骑手压平成 AbstractMap.SimpleEntry Rider 和 Unicorn 这是我的一部分。然后通过比较两个参数得到最大值 骑手 的 rideTime Optional.empty

        2
  •  1
  •   Koray Tugay    7 年前

    也许像这样,您可以添加所需的空检查。。

    // 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 在 Rider

    推荐文章