Java 8 Lambda:コンパレータの例

この例では、Java 8のラムダ式を使用してListをソートするための `Comparator`を書く方法を示します。
{空} 1。古典的な `Comparator`の例です。
Comparator<Developer> byName = new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
};
{空} 2。ラムダ式に相当する。
Comparator<Developer> byName =
(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1.ラムダなしでソートする
それらの年齢を使って `Developer`オブジェクトを比較する例です。通常、Collections.sort`を使用し、次のように匿名の `Comparator`クラスを渡します:
TestSorting.java
package com.mkyong.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<Developer> listDevs = getDevelopers();
System.out.println("Before Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
//sort by age
Collections.sort(listDevs, new Comparator<Developer>() {
@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<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("mkyong", 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=mkyong, 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=mkyong, salary=70000, age=33]Developer[name=iris, salary=170000, age=55].... ソートの要件が変更されたら、別の新しい匿名の `Comparator`クラスを渡します:
//sort by age
Collections.sort(listDevs, new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
//sort by name
Collections.sort(listDevs, new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
});
//sort by salary
Collections.sort(listDevs, new Comparator<Developer>() {
@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<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o2.getAge() - o1.getAge();
}
});
ラムダ式の例: TestSorting.java
package com.mkyong.java8;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
public class TestSorting {
public static void main(String[]args) {
List<Developer> 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<Developer> getDevelopers() {
List<Developer> result = new ArrayList<Developer>();
result.add(new Developer("mkyong", 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=mkyong, 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=mkyong, salary=70000, age=33]Developer[name=iris, salary=170000, age=55]….
3.その他のラムダの例
3.1年齢別ソート
//sort by age
Collections.sort(listDevs, new Comparator<Developer>() {
@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
Collections.sort(listDevs, new Comparator<Developer>() {
@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
Collections.sort(listDevs, new Comparator<Developer>() {
@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逆ソート。
3.4.1ラムダ式。給与を使ってリストをソートする。
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
listDevs.sort(salaryComparator);
出力
Developer[name=mkyong, 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ラムダ式。給与、逆順を使用してリストをソートする。
Comparator<Developer> salaryComparator = (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=mkyong, salary=70000, age=33]….
参考文献
Javaラムダ式の使用]。
https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html
[Oracle
: Lambda Expressions].
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html
[Oracle
: Comparator]