Java 8 Lambda:コンパレーターの例
この例では、Java 8 Lambda式を使用してComparator
を記述し、リストをソートする方法を示します。
1. 古典的なComparator
の例。
ComparatorbyName = new Comparator () { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } };
2. 同等のラムダ式。
ComparatorbyName = (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1. ラムダなしで並べ替え
年齢を使用してDeveloper
オブジェクトを比較する例。 通常、Collections.sort
を使用して、次のように匿名のComparator
クラスを渡します。
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; } }
出力
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]
並べ替えの要件が変更された場合は、別の新しい匿名のComparator
クラスを渡すだけです。
//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()); } });
動作しますが、1行のコードを変更したいという理由だけでクラスを作成するのは少し変だと思いますか?
2. ラムダで並べ替え
Java 8では、List
インターフェースはsort
メソッドを直接サポートしているため、Collections.sort
を使用する必要はありません。
//List.sort() since Java 8 listDevs.sort(new Comparator() { @Override public int compare(Developer o1, Developer o2) { return o2.getAge() - o1.getAge(); } });
ラムダ式の例:
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; } }
出力
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. その他のラムダの例
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);
出力
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());
出力
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]