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) { ListlistDevs = 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) { ListlistDevs = 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]