如何解决使用Lambda进行排序无法弄清楚为什么Java不起作用
我一直在尝试不同的排序方式,而我尝试的其中一种方法无法提供预期的输出结果。
我从代码中注释掉的Lamda排序中获得了预期的输出
employees.sort(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge));
Jack 40
John 29
John 30
Snow 22
Tim 21
但来自
employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge));
我得到的输出不正确
John 30
John 29
Tim 21
Jack 40
Snow 22
我在哪里弄错了?
package com;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Employee john = new Employee("John",30);
Employee john2 = new Employee("John",29);
Employee tim = new Employee("Tim",21);
Employee jack = new Employee("Jack",40);
Employee snow = new Employee("Snow",22);
List<Employee> employees = new ArrayList<>();
employees.add(john);
employees.add(john2);
employees.add(tim);
employees.add(jack);
employees.add(snow);
employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)); //does not sort original list
//employees.sort(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)); //sorts original list
for(Employee employee : employees){
System.out.println(employee.getName() + " " + employee.getAge());
}
}
}
class Employee{
private String name;
private int age;
public Employee(String name,int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
}
解决方法
.sorted()
不是终端操作。实际上,由于Streams是惰性的,因此在下面的代码行中没有任何反应。要确认,只需添加.peek(System.out::println)
,您将看到它永远不会执行。要排序,请添加终端操作.collect(Collectors.toList())
employees.stream().sorted(Comparator.comparing(Employee::getName)
.thenComparing(Employee::getAge));
,流很懒;仅对源数据进行计算 当启动终端操作时,源元素为 仅根据需要食用。
该工作示例对原始列表进行排序,但使用流返回一个新的排序列表。示例-您必须像下面那样收集它,并将employeeList与其他结果一起排序。
final List<Employee> employeeList = employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)).collect(Collectors.toList());
,
Stream不会修改现有集合。您必须收集(使用终端操作)它才能看到您在流上所做的更改。
List<Employee> sortedEmployees = employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)).collect(Collectors.toList())
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。