java8-Lambda中比较器Comparator的使用
来源:互联网 发布:ubuntu 更新系统命令 编辑:程序博客网 时间:2024/06/08 15:04
此教程旨在让读者学会使用lambda并结合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());
不使用Lambda的排序
假如我们要通过Developer 对象的年龄进行排序,通常情况下我们使用Collections.sort,new个匿名Comparator 类,类似下面这种:
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("ricky", 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 SortDeveloper [name=ricky, 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 SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=ricky, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]
当比较规则发生变化时,你需要再次new个匿名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()); } });
这样也可以,不过你会不会觉得这样有点怪,因为其实不同的只有一行代码而已,但是却需要重复写很多代码?
通过lambda进行排序
在java8中,List接口直接提供了排序方法, 所以你不需要使用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("ricky", 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 SortDeveloper [name=ricky, 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 SortDeveloper [name=jason, salary=100000, age=10]Developer [name=alvin, salary=80000, age=20]Developer [name=ricky, salary=70000, age=33]Developer [name=iris, salary=170000, age=55]
更多的Lambda 例子
根据年龄
//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());
根据名字
//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()));
根据薪水
//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()))
倒序
正常排序
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator);
倒序
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());
翻译
ricky 20170728
交流群:244930845
阅读全文
0 0
- java8-Lambda中比较器Comparator的使用
- java8中lambda的使用
- java中Comparator比较器的使用
- Java8:Lambda-Comparator
- java8中Lambda表达式的使用
- 比较器Comparator的使用
- 比较器Comparator的使用
- 关于Java中使用Comparator比较器的记录
- Java8中Lambda的用法
- 如何在Android studio中使用java8 的Lambda表达式
- Android Stutio中使用java8的Lambda表达式
- Java8 Lambda表达式之比较器
- Comparator比较器的使用,Map排序
- 028.Comparator 比较器的使用
- JAVA8-LAMBDA中reduce的用法
- TreeSet 使用 Comparator 比较器
- java8中lambda表达式
- java8 中Lambda表达式
- 静态代码扫描教程
- 将博客搬至CSDN
- Windows 下使用Git 客户端访问 GitLab 源代码管理库
- RecycleView
- 宁哥自编自导自演的《C语言,好爽》第7版(2017年)教程内容
- java8-Lambda中比较器Comparator的使用
- 欢迎使用CSDN-markdown编辑器
- 【LeetCode】37. Sudoku Solver
- 洛谷 P1305 新二叉树
- 鼠标滚动时执行事件,结束滚动时执行事件
- 7.28--SSH学习之MyBatis-Mapper
- Python3 文件处理
- Blast2GO使用方法详解(命令界面
- 【新手入门】什么是量化投资?