Java 8 Lambda : Comparator 示例

来源:互联网 发布:ubuntu常用命令 编辑:程序博客网 时间:2024/06/06 00:18

Java 8 Lambda : Comparator 示例

JDK8发布都三年多了,JDK9都快要出了,才去学习java8的我是不是有点晚了~ 在这留下学习的经验,主要以代码为准,实际的理论其实可以去看官方的更加详细。

在这个例子中,将向您展示如何使用Java 8 Lambda表达式来编写Comparator一个列表。

经典Comparator例子

Comparator<Developer> byName = new Comparator<Developer>() {@Overridepublic 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类:

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);}//sort by ageCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic 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 SortDeveloper [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 SortDeveloper [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 ageCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getAge() - o2.getAge();}});//sort by nameCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getName().compareTo(o2.getName());}});//sort by salaryCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getSalary().compareTo(o2.getSalary());}});
JDK8之前的写法,Lambda表达式 将焕然一新。

2.用Lambda排序

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

//List.sort() since Java 8listDevs.sort(new Comparator<Developer>() {@Overridepublic 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 here!listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());//java 8 only, lambda also, to print the ListlistDevs.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 SortDeveloper [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 SortDeveloper [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 ageCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getAge() - o2.getAge();}});//lambdalistDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());//lambda, valid, parameter type is optionallistDevs.sort((o1, o2)->o1.getAge()-o2.getAge());
3.2按名称排序

//sort by nameCollections.sort(listDevs, new Comparator<Developer>() {@Overridepublic int compare(Developer o1, Developer o2) {return o1.getName().compareTo(o2.getName());}});//lambdalistDevs.sort((Developer o1, Developer o2)->o1.getName().compareTo(o2.getName()));//lambda 此处由编译器推算出类型,可以不写参数类型listDevs.sort((o1, o2)->o1.getName().compareTo(o2.getName()));

3.4倒序

3.4.1使用他们的工资对列表排序的Lambda表达式。

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表达式对列表进行排序,使用他们的工资,相反的顺序。

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]



原创粉丝点击