Java8 Lambda表达式之比较器
2017-07-18 15:26
441 查看
在这个例子中,我将向你展示如何使用Java8的lambda表达式写的比较器排序列表。
经典
Lambda表达式方式
这个例子使用年龄比较
输出
当排序的需求要更改时,你需要通过一个新的
上面的代码可以工作,但是,你认为创建一个类只是因为你想改变一个单一的代码,不觉得有点奇怪吗?
在Java8中,
Lambda表达式示例:
输出
3.1 根据年龄排序
3.2 根据姓名排序
3.3 根据薪水排序
3.4 排序反转
3.4.1 使用lambda表达式对薪水进行排序
输出
3.4.2 使用lambda表达式对薪水进行反转排序
输出:
参考资料:
Start Using Java Lambda Expressions
Oracle : Lambda Expressions
Oracle : Comparator
欢迎star开源web框架Blade:http://github.com/biezhi/blade
经典
Comparator例子
Comparator<Developer> byName = new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o1.getName().compareTo(o2.getName()); } };
Lambda表达式方式
Comparator<Developer> byName = (Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());
1. 使用Lambda排序
这个例子使用年龄比较Developer对象,通常你使用
Collections.sort并且通过一个匿名函数实现
Comparator:
import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; < 4000 span class="token keyword" style="color:rgb(102,217,239);">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()); } });
上面的代码可以工作,但是,你认为创建一个类只是因为你想改变一个单一的代码,不觉得有点奇怪吗?
2. 使用Lambda排序
在Java8中,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(); } });
Lambda表达式示例:
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. 更多Lambda表达式例子
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 使用lambda表达式对薪水进行排序
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 使用lambda表达式对薪水进行反转排序
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]
参考资料:
Start Using Java Lambda Expressions
Oracle : Lambda Expressions
Oracle : Comparator
欢迎star开源web框架Blade:http://github.com/biezhi/blade
相关文章推荐
- Java8 Lambda表达式之比较器
- Java 8新特性:新语法方法引用和Lambda表达式及全新的Stream API
- Java8之——简洁优雅的Lambda表达式
- JAVA 8 StreamAPI 和 lambda表达式 总结(四)--stream的一些聚合操作
- Java8:Lambda表达式增强版Comparator和排序
- Android Studio使用gradle-retrolambda支持Java8 新特性 Lambde表达式
- (持续更新)Java8.0 Lambda表达式实际应用案例
- Java 8 新特性(一)lambda表达式
- java8 lambda表达式的一些用法
- Java 8:Lambda表达式试水
- Java8新特性之forEach+Lambda 表达式遍历Map和List
- Java Lambda表达式入门
- Java8体验(一)lambda表达式语法
- Java 8 新特性:Lambda 表达式的作用域(Lambda 表达式补充版)
- java8 lambda表达式的几个示例
- JAVA8新特性(Lambda 表达式)
- java8新特性学习笔记(一) Lambda表达式
- Java8--Lambda表达式、Stream和时间API
- java8新特性lambda表达式
- Java新特性-Lambda表达式入门