英文:
Using Lambda to sort can't figure out why it's not working Java
问题
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
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.sort(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)); // sorts the 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;
}
}
Note: The corrected code sorts the original list using the .sort()
method. The incorrect output you were getting with the .stream().sorted()
approach was because the sorting operation using the stream didn't modify the original list; it only provided a new sorted stream as output.
英文:
I have been trying different ways of sorting and 1 of the methods I tried does not give the output I would expect.
I get the expected output from the Lamda sort that is commented out in the code
employees.sort(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge));
Jack 40
John 29
John 30
Snow 22
Tim 21
but from
employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge));
I get this incorrect output
John 30
John 29
Tim 21
Jack 40
Snow 22
Where have I made the mistake?
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;
}
}
答案1
得分: 2
.sorted()
不是一个终端操作。事实上,在下面的代码行中没有任何操作,因为流是惰性的。要确认,请添加.peek(System.out::println)
,你会发现这永远不会被执行。要进行排序,请添加终端操作.collect(Collectors.toList())
employees.stream().sorted(Comparator.comparing(Employee::getName)
.thenComparing(Employee::getAge));
来自文档:
流是惰性的;只有在启动终端操作时才会对源数据进行计算,并且只在需要时才会消耗源元素。
英文:
.sorted()
is not a terminal operation. In fact, nothing happens in below line of code as Streams are lazy. To confirm, just add .peek(System.out::println)
and you'll see that this is never executed. To sort, add terminal operation .collect(Collectors.toList())
employees.stream().sorted(Comparator.comparing(Employee::getName)
.thenComparing(Employee::getAge));
From documentation -
> Streams are lazy; computation on the source data is only performed
> when the terminal operation is initiated, and source elements are
> consumed only as needed.
答案2
得分: 1
工作示例对原始列表进行排序,但使用流(Stream)时会返回一个新的已排序列表。示例 - 您必须像下面这样收集它,employeeList 与其他结果一样被排序。
final List<Employee> employeeList = employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)).collect(Collectors.toList());
英文:
The working example sorts the original list but with stream it returns a new sorted one. Example -You have to collect it like below , and employeeList is sorted as other result.
final List<Employee> employeeList = employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)).collect(Collectors.toList());
答案3
得分: 1
流不会修改现有集合。您必须收集(使用终端操作)流以查看对流所做的更改。
List<Employee> sortedEmployees = employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)).collect(Collectors.toList());
英文:
Stream doesn't modify existing collection. You have to collect(using terminal operation) it to see changes you made on stream.
List<Employee> sortedEmployees = employees.stream().sorted(Comparator.comparing(Employee::getName).thenComparing(Employee::getAge)).collect(Collectors.toList())
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论