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

时间:2016-01-13 20:18:11

标签: java collections java-8 java-stream

我有Collection<List<SomeObject>> values

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

我尝试了类似的东西,但它并没有完成工作

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

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

2 个答案:

答案 0 :(得分:11)

我想你想要

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

答案 1 :(得分:2)

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

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