Java 8 Lambda: exemple de comparaison

Dans cet exemple, nous allons vous montrer comment utiliser l'expression Lambda Java 8 pour écrire unComparator pour trier une liste.
1. Exemple classique deComparator.
ComparatorbyName = new Comparator () { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } };
2. Expression d'expression lambda.
ComparatorbyName = (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1. Trier sans Lambda
Exemple pour comparer les objetsDeveloper en utilisant leur âge. Normalement, vous utilisezCollections.sort et passez une classeComparator anonyme comme ceci:
TestSorting.java
package com.example.java8;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class TestSorting {
public static void main(String[] args) {
List listDevs = getDevelopers();
System.out.println("Before Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
//sort by age
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
System.out.println("After Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
}
private static List getDevelopers() {
List result = new ArrayList();
result.add(new Developer("example", new BigDecimal("70000"), 33));
result.add(new Developer("alvin", new BigDecimal("80000"), 20));
result.add(new Developer("jason", new BigDecimal("100000"), 10));
result.add(new Developer("iris", new BigDecimal("170000"), 55));
return result;
}
}
Sortie
Before Sort Developer [name=example, salary=70000, age=33] Developer [name=alvin, salary=80000, age=20] Developer [name=jason, salary=100000, age=10] Developer [name=iris, salary=170000, age=55] After Sort Developer [name=jason, salary=100000, age=10] Developer [name=alvin, salary=80000, age=20] Developer [name=example, salary=70000, age=33] Developer [name=iris, salary=170000, age=55]
Lorsque l'exigence de tri est modifiée, il vous suffit de passer une autre nouvelle classeComparator anonyme:
//sort by age
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
//sort by name
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
});
//sort by salary
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getSalary().compareTo(o2.getSalary());
}
});
Cela fonctionne, mais pensez-vous que c'est un peu bizarre de créer une classe juste parce que vous voulez changer une seule ligne de code?
2. Trier avec Lambda
Dans Java 8, l'interfaceList prend directement en charge la méthodesort, plus besoin d'utiliserCollections.sort.
//List.sort() since Java 8
listDevs.sort(new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o2.getAge() - o1.getAge();
}
});
Exemple d'expression lambda:
TestSorting.java
package com.example.java8;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class TestSorting {
public static void main(String[] args) {
List listDevs = getDevelopers();
System.out.println("Before Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
System.out.println("After Sort");
//lambda here!
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
//java 8 only, lambda also, to print the List
listDevs.forEach((developer)->System.out.println(developer));
}
private static List getDevelopers() {
List result = new ArrayList();
result.add(new Developer("example", new BigDecimal("70000"), 33));
result.add(new Developer("alvin", new BigDecimal("80000"), 20));
result.add(new Developer("jason", new BigDecimal("100000"), 10));
result.add(new Developer("iris", new BigDecimal("170000"), 55));
return result;
}
}
Sortie
Before Sort Developer [name=example, salary=70000, age=33] Developer [name=alvin, salary=80000, age=20] Developer [name=jason, salary=100000, age=10] Developer [name=iris, salary=170000, age=55] After Sort Developer [name=jason, salary=100000, age=10] Developer [name=alvin, salary=80000, age=20] Developer [name=example, salary=70000, age=33] Developer [name=iris, salary=170000, age=55]
3. Plus d'exemples Lambda
3.1 Sort By age
//sort by age
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
//lambda, valid, parameter type is optional
listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());
3.2 Sort by name
//sort by name
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
});
//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName()));
//lambda
listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));
3.3 Sort by salary
//sort by salary
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getSalary().compareTo(o2.getSalary());
}
});
//lambda
listDevs.sort((Developer o1, Developer o2)->o1.getSalary().compareTo(o2.getSalary()));
//lambda
listDevs.sort((o1, o2)->o1.getSalary().compareTo(o2.getSalary()));
3.4 Reversed sorting.
3.4.1 Lambda expression to sort a List using their salary.
ComparatorsalaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator);
Sortie
Developer [name=example, salary=70000, age=33] Developer [name=alvin, salary=80000, age=20] Developer [name=jason, salary=100000, age=10] Developer [name=iris, salary=170000, age=55]
3.4.2 Lambda expression to sort a List using their salary, reversed order.
ComparatorsalaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());
Sortie
Developer [name=iris, salary=170000, age=55] Developer [name=jason, salary=100000, age=10] Developer [name=alvin, salary=80000, age=20] Developer [name=example, salary=70000, age=33]