【问题标题】:Java 8 Stream - Find largest nested listJava 8 Stream - 查找最大的嵌套列表
【发布时间】:2016-01-13 20:18:10
【问题描述】:

我有一个Collection<List<SomeObject>> values

如何使用 Streams 找到具有最大列表的集合?

我尝试过类似的方法,但效果不佳

values.stream().max(e -> e.stream().max(List::size).get()).get()

但是我得到编译错误。 有什么想法吗?

【问题讨论】:

    标签: java collections java-8 java-stream


    【解决方案1】:

    我想你想要

     values.stream().max(Comparator.comparingInt(List::size)).get()
    

    如果您需要重复,我能想到的最佳解决方案是

    values.stream()
       .collect(Collector.of(
          ArrayList::new,
          (List<List<SomeObject>> best, List<SomeObject> elem) -> {
            if (best.isEmpty()) {
              best.add(elem);
            } else if (best.get(0).size() < elem.size()) {
              best.clear();
              best.add(elem);
            }
          },
          (best1, best2) -> {
            if (best1.isEmpty() || best2.isEmpty()
                  || best1.get(0).size() == best2.get(0).size()) {
              best1.addAll(best2);
              return best1;
            } else if (best1.get(0).size() > best2.get(0).size()) {
              return best1;
            } else {
              return base2;
            }
          }));
    

    【讨论】:

    • 我想你可以为它写一个特殊的Collector,但这很难。
    • @ShervinAsgari 我的回答现在提供了一个基于Stream 的解决方案,可以一次性使用,尽管它确实需要大量的工作。
    • 我怀疑您是否测试过它,因为它无法编译,因为您使用的 collect 方法需要 BiConsumer 作为组合器。此外,如果列表的大小与已存储的最大大小相同,您似乎错过了在累加器中添加列表。无论如何,链接问题中的实现更具可重用性。
    • @AlexisC。我很好。不,我没有测试它。
    【解决方案2】:

    我的StreamEx 库提供了一个现成的collector 来查找所有最大元素:

    List<List<SomeObject>> result = values.stream()
                    .collect(MoreCollectors.maxAll(Comparator.comparingInt(List::size)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      • 2019-03-07
      • 1970-01-01
      • 2011-06-15
      • 2021-01-13
      相关资源
      最近更新 更多