使用Java中的stream.sorted()对列表进行排序

Iva*_*n C 70 java sorting list java-stream

我有兴趣从流中排序列表.这是我正在使用的代码:

list.stream()
    .sorted((o1, o2)->o1.getItem().getValue().compareTo(o2.getItem().getValue()))
    .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?该列表没有排序.

它应该根据具有最低值的项目对列表进行排序.

for (int i = 0; i < list.size(); i++)
{
   System.out.println("list " + (i+1));
   print(list, i);
}
Run Code Online (Sandbox Code Playgroud)

和打印方法:

public static void print(List<List> list, int i)
{
    System.out.println(list.get(i).getItem().getValue());
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 115

Collections.sort()与参数引用的排序方式不同.在这种情况下,您只需获取需要收集的已排序流并最终分配给另一个变量:

List result = list.stream().sorted((o1, o2)->o1.getItem().getValue().
                                   compareTo(o2.getItem().getValue())).
                                   collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

你刚刚错过了分配结果

  • 提示:在更高版本的 Java 中,您可以将 `collect( Collectors.toList() )` 替换为 `toList()`。 (3认同)
  • .toList() 是在 JDK 16 中添加的。 Comparator.comparing() 可以替换此处的样板代码。 (3认同)

Riv*_*ver 52

list.sort改为使用:

list.sort((o1, o2) -> o1.getItem().getValue().compareTo(o2.getItem().getValue()));
Run Code Online (Sandbox Code Playgroud)

并使用Comparator.comparing以下内容使其更简洁:

list.sort(Comparator.comparing(o -> o.getItem().getValue()));
Run Code Online (Sandbox Code Playgroud)

在其中任何一个之后,它们list将被分类.

您的问题是 返回已排序的数据,它不会按照您的预期进行排序.list.stream.sorted

  • list.sort(Comparator.comparing(o-&gt; o.getItem()。getValue()));对我来说是新的。大! (3认同)

小智 23

Java 8提供了不同的实用程序api方法来帮助我们更好地对流进行排序.

如果您的列表是整数列表(或Double,Long,String等),那么您可以使用java提供的默认比较器对列表进行排序.

List<Integer> integerList = Arrays.asList(1, 4, 3, 4, 5);
Run Code Online (Sandbox Code Playgroud)

在飞行中创建比较器:

integerList.stream().sorted((i1, i2) -> i1.compareTo(i2)).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

当没有参数传递给sorted()时,使用java 8提供的默认比较器:

integerList.stream().sorted().forEach(System.out::println); //Natural order
Run Code Online (Sandbox Code Playgroud)

如果要按相反顺序对相同列表进行排序:

integerList.stream()排序(Comparator.reverseOrder())的forEach(的System.out ::的println).; // 相反的顺序

如果列表是用户定义对象的列表,则:

 integerList.stream().sorted(Comparator.reverseOrder()).forEach(System.out::println); // Reverse Order
Run Code Online (Sandbox Code Playgroud)

在飞行中创建比较器:

List<Person> personList = Arrays.asList(new Person(1000, "First", 25, 30000),
        new Person(2000, "Second", 30, 45000),
        new Person(3000, "Third", 35, 25000));
Run Code Online (Sandbox Code Playgroud)

使用Comparator.comparingLong()方法(我们也有compareDouble(),comparisonInt()方法):

personList.stream().sorted((p1, p2) -> ((Long)p1.getPersonId()).compareTo(p2.getPersonId()))
        .forEach(person -> System.out.println(person.getName()));
Run Code Online (Sandbox Code Playgroud)

使用Comparator.comparing()方法(基于提供的getter方法进行比较的通用方法):

personList.stream().sorted(Comparator.comparingLong(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));
Run Code Online (Sandbox Code Playgroud)

我们也可以使用thenComparing()方法进行链接:

personList.stream().sorted(Comparator.comparing(Person::getPersonId)).forEach(person -> System.out.println(person.getName()));
Run Code Online (Sandbox Code Playgroud)

人类

personList.stream().sorted(Comparator.comparing(Person::getPersonId).thenComparing(Person::getAge)).forEach(person -> System.out.println(person.getName())); //Sorting by person id and then by age.
Run Code Online (Sandbox Code Playgroud)

  • 我觉得这个答案对于这个问题来说太详细了,但是根本没有解决这个问题。考虑改用自我解答中的答案。 (3认同)