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

She*_*ari 4 java collections java-8 java-stream

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

如何使用Streams找到包含最大列表的集合?

我尝试过类似的东西,但它并不常用

values.stream().max(e -> e.stream().max(List::size).get()).get()
Run Code Online (Sandbox Code Playgroud)

但我得到编译错误.有任何想法吗?

Lou*_*man 14

我想你想要的

 values.stream().max(Comparator.comparingInt(List::size)).get()
Run Code Online (Sandbox Code Playgroud)

如果你需要重复,我能想到的最佳解决方案就是这样的

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;
        }
      }));
Run Code Online (Sandbox Code Playgroud)

  • @ShervinAsgari见http://stackoverflow.com/questions/29334404/how-to-force-max-to-return-all-maximum-values-in-a-java-stream/29334774 (2认同)
  • 我想您可能会为此写一个特殊情况的`Collector`,但这很难。 (2认同)
  • @ShervinAsgari我的答案现在提供了一个基于“流”的解决方案,该解决方案可以一次通过,尽管确实需要大量工作。 (2认同)
  • 我怀疑您对其进行了测试,因为它不能编译,因为您使用的collect方法需要BiConsumer作为组合器。另外,如果列表的大小与已存储的最大大小相同,则似乎错过了将列表添加到累加器中的可能性。无论如何,链接问题中的实现是可重用的。 (2认同)
  • @AlexisC。我很好。不,我没有测试。 (2认同)