如何使用流对列表进行排序?

时间:2016-03-02 13:07:03

标签: java java-8 java-stream

我想排序一个简单的清单。 Integers的示例:

List<Integer> numbers = Arrays.asList(4, 2, 7, 1, 4);
numbers.stream().sorted((n1, n2) -> {
    System.out.println("comparing: " + n1 + " with " + n2);
    return Integer.compare(n1, n2);
});

结果:没有打印出来!没有应用排序。 因此,甚至不执行排序方法。为什么呢?

旁注:我的目的是直接修改列表(在对象内),因此我试图阻止创建新列表。

3 个答案:

答案 0 :(得分:6)

sorted()不是终端操作,因此它不会执行Stream管道。

您必须应用某些终端操作,例如.collect(Collectors.toList()),以便执行排序(以及任何其他中间操作)。

List<Integer> sorted = numbers.stream().sorted((n1, n2) -> {
    System.out.println("comparing: " + n1 + " with " + n2);
    return Integer.compare(n1, n2);
}).collect(Collectors.toList());

如果要对原始列表进行排序而不创建新列表,请使用List&#39; sort方法:

numbers.sort((n1, n2) -> {
    System.out.println("comparing: " + n1 + " with " + n2);
    return Integer.compare(n1, n2);
});

当然,您并不需要传递Comparator,因为您使用的是自然的Integer顺序,如果您只是写一下,默认情况下会使用该顺序:

List<Integer> numbers = Arrays.asList(4, 2, 7, 1, 4);
numbers.sort (null);
System.out.println (numbers);

输出:

[1, 2, 4, 4, 7]

来自List&#39; s sort Javadoc:

  

如果指定的比较器为null,则此列表中的所有元素必须实现Comparable接口和元素&#39;应该使用自然排序。

答案 1 :(得分:2)

您可以直接在列表上使用排序方法     numbers.sort((n1,n2) -> n1.compareTo(n2));

答案 2 :(得分:1)

如果要修改列表,可以使用Collections.sort(List)方法而不是使用流。

示例:

List<Integer> numbers = Arrays.asList(4, 2, 7, 1, 4);
Collections.sort(numbers);
System.out.println(numbers);