我是靠谱客的博主 能干小伙,这篇文章主要介绍Java 8 Lambda : Comparator 示例,现在分享给大家,希望可以做个参考。

英文原文

Developer.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import java.math.BigDecimal; /** * <p> Developer </p> * * @author 三产 * @version 1.0 * @date 2017-04-26 * @QQGroup 213732117 * @website http://www.coderknock.com * @copyright Copyright 2017 拿客 coderknock.com All rights reserved. * @since JDK 1.8 */ public class Developer { String name; BigDecimal salary; int age; public Developer(String name, BigDecimal salary, int age) { this.name = name; this.salary = salary; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getSalary() { return salary; } public void setSalary(BigDecimal salary) { this.salary = salary; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Developer [" + "name='" + name + ''' + ", salary=" + salary + ", age=" + age + ']'; } }

经典 Comparator 示例:

复制代码
1
2
3
4
5
6
7
Comparator<Developer> byName = new Comparator<Developer>() { @Override public int compare(Developer developer, Developer compareDeveloper) { return developer.getName().compareTo(compareDeveloper.getName()); } };

对应的 Lambda 表达式示例:

复制代码
1
2
3
Comparator<Developer> byNameLambda = (Developer developer, Developer compareDeveloper)->developer.getName().compareTo(compareDeveloper.getName());

Java8更简洁的一种写法:

复制代码
1
2
Comparator<Developer> byNameLambdaSimple = Comparator.comparing(Developer::getName);

1.不用Lambda排序

比较 Developer的对象的 age 的示例。通常使用 Collections.sort 并传递一个这样的匿名Comparator类:

TestSorting.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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; } }

输出

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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类:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//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排序

在Java 8中,List 接口支持直接使用 sort 该方法,不再需要使用 Collections.sort 了。

复制代码
1
2
3
4
5
6
7
8
//List.sort() since Java 8 listDevs.sort(new Comparator<Developer>() { @Override public int compare(Developer o1, Developer o2) { return o2.getAge() - o1.getAge(); } });

Lambda表达式示例:

TestSorting.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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; } }

输出

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
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按年龄排序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//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()); // lambda listDevs.sort(Comparator.comparing(Developer::getAge));

3.2按名称排序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//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())); // lambda listDevs.sort(Comparator.comparing(Developer::getName));

3.3按薪水排序

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//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())); // lambda listDevs.sort(Comparator.comparing(Developer::getSalary));

3.4 反转排序

3.4.1使用Lambda表达式对列表进行工资由少到多的排序。

复制代码
1
2
3
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator);

输出

复制代码
1
2
3
4
5
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表达式对列表进行工资由多到少的排序。

复制代码
1
2
3
Comparator<Developer> salaryComparator = (o1, o2)->o1.getSalary().compareTo(o2.getSalary()); listDevs.sort(salaryComparator.reversed());

输出

复制代码
1
2
3
4
5
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]

参考文献

  1. 开始使用Java Lambda表达式
  2. Oracle:Lambda表达式
  3. Oracle:比较器

最后

以上就是能干小伙最近收集整理的关于Java 8 Lambda : Comparator 示例的全部内容,更多相关Java内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部