In this example, we can see the class Person and we use stream’s sorted() method to sort the list of people by their age. So in order for sorted() to work, it needs to have a natural order. For this reason, we have to implement the Comparable interface for the class which needs to be sorted.
The documentation for sorted() states:
“Returns a stream consisting of the elements of this stream, sorted according to natural order. If the elements of this stream are not Comparable, a java.lang.ClassCastException may be thrown when the terminal operation is executed.
For ordered streams, the sort is stable. For unordered streams, no stability guarantees are made.
This is a stateful intermediate operation.”
import java.util.List;
import java.util.stream.Collectors;
public class Main {
static class Person implements Comparable<Person> {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Person person) {
return this.age.compareTo(person.getAge());
}
}
public static void main(String[] args)
{
List<Person> people = List.of(
new Person("Jim", 56),
new Person("Tom", 13),
new Person("Maria", 20)
);
// Sort by natural order
List<Person> sortedPeopleList = people
.stream()
.sorted()
.collect(Collectors.toList());
// get the youngest person
System.out.println("Youngest person: " + sortedPeopleList.get(0));
// get the oldest person
Integer lastIndex = sortedPeopleList.size() - 1;
System.out.println("Oldest person: " + sortedPeopleList.get(lastIndex));
}
}Youngest person: Person{name='Tom', age=13}
Oldest person: Person{name='Jim', age=56}Let’s see a similar implementation with Record for Person. We can see how much less code is needed:
import java.util.List;
import java.util.stream.Collectors;
public class MainClass {
record Person (String name, Integer age) implements Comparable<Person> {
@Override
public int compareTo(Person person) {
return this.age.compareTo(person.age());
}
}
public static void main(String[] args)
{
List<Person> people = List.of(
new Person("Jim", 56),
new Person("Tom", 13),
new Person("Maria", 20)
);
// Sort by natural order
List<Person> sortedPeopleList = people
.stream()
.sorted()
.collect(Collectors.toList());
// get the youngest person
System.out.println("Youngest person: " + sortedPeopleList.get(0));
// get the oldest person
Integer lastIndex = sortedPeopleList.size() - 1;
System.out.println("Oldest person: " + sortedPeopleList.get(lastIndex));
}
}Youngest person: Person[name=Tom, age=13]
Oldest person: Person[name=Jim, age=56]
