今天开始学习Java 8 的 Lambda 表达式,写比较器去操作List 的排序
1.不使用Lambda 进行排序
package sort;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
* 不使用Lambda进行排序
*/
public class SortWithoutLambda {
public static void main(String[] args) {
List<Developer> listDevs = getDevelopers();
System.out.println("Before Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
//重写Comparator规则
Collections.sort(listDevs, new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge()-o2.getAge();
// return o1.getAge().compareTo(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<>();
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;
}
}
当排序规则改变了, 你还要创建一个新的匿名类 :
Java 8 有了 List.sort() 方法,但这样其实差不多的
listDevs.sort(new Comparator<Developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge()-o2.getAge();
}
});
但这也给使用lambda 提供了可能
package sort;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
/**
* 使用Lambda进行排序
*/
public class SortWithLambda {
public static void main(String[] args) {
List<Developer> listDevs = getDevelopers();
System.out.println("Before Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
// List.sort() since Java 8
// way1 listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
// way2 listDevs.sort((o1,o2)->o1.getAge()-o2.getAge());
// Comparator<Developer> ageComparator = (o1,o2)->o1.getAge()-o2.getAge();
// listDevs.sort(ageComparator.reversed());
/**上面两个reversed的话要自己反着写比较规则
* 或者 把Compator 拿出来再进行反转,这样失去了 lambda 的意义
* 使用新方式
*/
listDevs.sort(Comparator.comparing(Developer::getAge).reversed());//反转
System.out.println("After Sort");
// listDevs.forEach((developer -> System.out.println(developer))); // old way
listDevs.forEach(System.out::println);
}
private static List<Developer> getDevelopers(){
List<Developer> result = new ArrayList<>();
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;
}
}