Java 8 Stream - 查找最大的嵌套列表

5

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

如何使用Streams查找最大列表的集合?

我尝试了以下代码,但它并不能完全解决问题。

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

但是我遇到了编译错误。 有什么想法吗?
2个回答

15
我认为你想要的是:

我想你想要

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

2
@ShervinAsgari 请查看 https://dev59.com/Ml0b5IYBdhLWcg3wUP0X#29334774 - Alexis C.
2
我想你可能可以为此编写一个特殊的“Collector”,但那会很困难。 - Louis Wasserman
2
@ShervinAsgari 我的答案现在提供了一种基于Stream的解决方案,可以在单次遍历中工作,尽管它需要相当多的工作。 - Louis Wasserman
2
我怀疑你没有测试它,因为它无法编译,因为你正在使用的collect方法需要一个BiConsumer作为组合器。此外,如果累加器中的列表大小与已存储的最大大小相同,则似乎你忘记将列表添加到其中。无论如何,链接问题中的实现更具可重用性。 - Alexis C.
2
@AlexisC。我对此没有问题。不,我没有测试它。 - Louis Wasserman
显示剩余3条评论

3

我的StreamEx库提供了一个现成的收集器,用于查找所有最大元素:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接