使用 Java 流从集合中查找最小和最大数字

问题描述 投票:0回答:2

下面是代码片段,正如预期的那样,它在编译时失败。

我真正想做的是使用流从所有列表中找到最小值和最大值。

public class Delete {

   public static void main(String[] args) {

      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 677, 0);
      List<Integer> list1 = Arrays.asList(11, 12, 23, 34, 25, 77);
      List<Integer> list2 = Arrays.asList(12, 21, 30, 14, 25, 67);
      List<Integer> list3 = Arrays.asList(41, 25, 37, 84, 95, 7);

      List<List<Integer>> largeList = Arrays.asList(list, list1, list2, list3);

      System.out.println(largeList.stream().max(Integer::compare).get());
      System.out.println(largeList.stream().min(Integer::compare).get());
   }

}
java java-8 java-stream
2个回答
9
投票

您必须将所有

List
的元素扁平化为单个
Stream<Integer>
才能使您的代码正常工作:

System.out.println(largeList.stream().flatMap(List::stream).max(Integer::compare).get());
System.out.println(largeList.stream().flatMap(List::stream).min(Integer::compare).get());

但这不是很高效,因为您需要处理

List
两次才能找到
min
max
,并且您可以使用
IntStream::summaryStatistics() 在一次处理中获得相同的数据(以及更多数据) 

IntSummaryStatistics stats = largeList.stream().
                                      .flatMap(List::stream)
                                      .mapToInt(Integer::intValue)
                                      .summaryStatistics();
System.out.println(stats.getMin());
System.out.println(stats.getMax());

这是自 Java 12 以来可用的另一个解决方案:

System.out.println (largeList.stream()
                             .flatMap(List::stream)
                             .collect(Collectors.teeing(
                                          Collectors.maxBy (Integer::compare),
                                          Collectors.minBy (Integer::compare),
                                          List::of
                                     )));

使用

Collectors.teeing
允许您在同一个
Collector
上应用两个
Stream
,然后对两个
Collector
的结果执行任何您想要的操作。在此示例中,第一个
Collector
将计算最大元素,第二个
Collector
将计算最小元素,这两个数字将收集到一个
List
中。输出是
List<Optional<Integer>>
,其中第一个元素保存最大值,第二个元素保存最小值。


2
投票

试试这个:

largeList.stream().flatMap(List::stream).max(Integer::compare).get();
© www.soinside.com 2019 - 2024. All rights reserved.