如何使用 java 流从列表中获取前 5 个最大值

Raj*_*jan 1 java reduce mapreduce collect java-stream

我有一个整数列表

List<Integer> lst = new ArrayList<>();
lst.add(10);
lst.add(15);
lst.add(16);
lst.add(8);
lst.add(100);
lst.add(1);
lst.add(40);
Run Code Online (Sandbox Code Playgroud)

如何编写代码以便我可以从列表中获取前 5 个最大元素,即100, 40, 16, 15, 10

我尝试过使用 Java 流 API:

Integer var = lst.stream().max(Integer::compare).get();
Run Code Online (Sandbox Code Playgroud)

但只得到一个值元素。

dre*_*ash 7

我尝试过使用Java Stream API,但只得到一个值,

Integer var = lst.stream().max(Integer::compare).get();

这将为您提供该列表的最大值。要获得前 5 名,您必须执行以下操作:

lst.stream()
   .sorted(Comparator.reverseOrder())
   .limit(5)
   .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

排序的方法将按升序排序,如下所示:

sorted() 返回一个由该流的元素组成的流,按自然顺序排序。

但是,我们可以使用sorted(Comparator<? super T> comparator)它:

返回一个由该流的元素组成的流,根据提供的比较器进行排序。

因此,您需要通过Comparator.reverseOrder()来按降序排序。将从limit(5)流中提取前 5 个元素。

通用的方法:

private static void printTop(Collection<Integer> col, int top) {
    List<Integer> collect = col.stream().sorted(Comparator.reverseOrder()).limit(top).collect(Collectors.toList());
    System.out.println(collect);
}
Run Code Online (Sandbox Code Playgroud)

一个运行的例子:

public static void main(String []args){
    List<Integer> lst = List.of(10, 15, 16, 8, 100, 1, 40);
    printTop(lst, 5);
}

private static void printTop(Collection<Integer> col, int top) {
    List<Integer> collect = col.stream().sorted(Comparator.reverseOrder()).limit(top).collect(Collectors.toList());
    System.out.println(collect);
}
Run Code Online (Sandbox Code Playgroud)

输出:

[100, 40, 16, 15, 10]
Run Code Online (Sandbox Code Playgroud)