本套JAVA8教程暂时有大量英文内容, 中文翻译工作正在进行中。
> 如果你愿意翻译其中的小部份的内容,我们非常感谢你的付出。 而且操作非常简单, 你只需要标题附近的"修改教程"按钮然后就可以修改和保存了
,不用担心被改坏了,我们后台有强大的对比审核工具,会确保教程的准确性。
Lambda表达式 : 排序例子
在这个例子中,我们将向你展示如何使用 Java 8 Lambda 表达式去书写一个 Comparator
来对一个List排序.
- 传统
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来排序
使用 age 来比较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);
}
//通过名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;
}
}
Output
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
类来实现 :
//通过age排序
Collections.sort(listDevs, new Comparator<developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
//通过name排序
Collections.sort(listDevs, new Comparator<developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
});
//通过Salary来排序
Collections.sort(listDevs, new Comparator<developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getSalary().compareTo(o2.getSalary());
}
});
这样从逻辑上讲没有问题, 但是, 但是你想过没有,你为了只改变一行代码而创建了一个对象?
2. 通过Lambda排序
在 Java 8里面, List
接口支持直接使用sort
方法,再也不需要使用Collections.sort
.
//List.sort()
listDevs.sort(new Comparator<developer>() {
@Override
public int compare(Developer o1, Developer o2) {
return o2.getAge() - o1.getAge();
}
});
Lambda 表达式例子 :
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 表达式!
listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());
//java 8 , lambda也可以打印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;
}
}
Output
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 通过age排序
//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, 泛型参数
listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());
3.2 通过name排序
//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 通过salary排序
//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 表达式通过salary排序.
Comparator<developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
listDevs.sort(salaryComparator);
Output
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 表达式通过salary倒序排序.
Comparator<developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary());
listDevs.sort(salaryComparator.reversed());
Output
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][Oracle _ Comparator]
[Oracle _ Comparator]: https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html