java8重写comparator,Java 8 Lambda : Comparator 示例
Developer.java
import java.math.BigDecimal;
/**
*
Developer
*
* @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 示例:
Comparator byName = new Comparator() {
@Override
public int compare(Developer developer, Developer compareDeveloper) {
return developer.getName().compareTo(compareDeveloper.getName());
}
};
对应的 Lambda 表达式示例:
Comparator byNameLambda =
(Developer developer, Developer compareDeveloper)->developer.getName().compareTo(compareDeveloper.getName());
Java8更简洁的一种写法:
Comparator byNameLambdaSimple = Comparator.comparing(Developer::getName);
1.不用Lambda排序
比较 Developer的对象的 age 的示例。通常使用 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 listDevs = getDevelopers();
System.out.println("Before Sort");
for (Developer developer : listDevs) {
System.out.println(developer);
}
//sort by age
Collections.sort(listDevs, new Comparator() {
@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 getDevelopers() {
List result = new ArrayList();
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() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getAge() - o2.getAge();
}
});
//sort by name
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getName().compareTo(o2.getName());
}
});
//sort by salary
Collections.sort(listDevs, new Comparator() {
@Override
public int compare(Developer o1, Developer o2) {
return o1.getSalary().compareTo(o2.getSalary());
}
});
它是有效的,但是你不认为仅仅因为要改变一行代码创建一个类是有点奇怪的么?
2.用Lambda排序
在Java 8中,List 接口支持直接使用 sort 该方法,不再需要使用 Collections.sort 了。
//List.sort() since Java 8
listDevs.sort(new Comparator() {
@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 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 getDevelopers() {
List result = new ArrayList();
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() {
@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按名称排序
//sort by name
Collections.sort(listDevs, new Comparator() {
@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按薪水排序
//sort by salary
Collections.sort(listDevs, new Comparator() {
@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表达式对列表进行工资由少到多的排序。
Comparator 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 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]
参考文献
java8重写comparator,Java 8 Lambda : Comparator 示例相关推荐
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
- Java 8 Lambda表达式10个示例【存】
PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...
- 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】
深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...
- JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)
文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...
- JAVA复合判断_一起来学Java8(四)——复合Lambda
在一起来学Java8(二)--Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda. Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用La ...
- Java Comparator源码总结 Comparator源码注释翻译和解析中英文对照版
版本 JDK8(JDK1.8) Comparator接口重点 1.Comparator接口是一个函数式接口,里面只有一个虚方法compare(T o1, T o2),该接口表示一个比较器,而实现Com ...
- Java学习(90)Java集合排序——Comparator接口介绍、案例:对宠物猫分别按名字升序、年龄降序进行排列
Java集合排序--Comparator接口介绍.案例:对宠物猫分别按名字升序.年龄降序进行排列 Comparator接口介绍 1. Comparator接口: 2. Comparator接口中的co ...
- java map comparator,Java TreeMap comparator()方法
Java TreeMap comparator()方法 java.util.TreeMap.comparator() 返回按顺序排列键的比较器:如果映射使用自然顺序,则返回null. 1 语法 pub ...
- Java创建comparator对象,Java Comparable 和 Comparator 的详解及区别
Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. C ...
最新文章
- python多线程输出_Python多线程
- Leetcode 242. 有效的字母异位词 解题思路及C++实现
- python 权限修饰符
- RocketMQ消息支持的模式-消息异步发送
- cocos中如何让背景模糊_Cocos2d-x shader学习2: 模糊(Blur)
- #西柚姨妈体#蹿红微博 流行体之风重袭网络
- WindowsXP_KB909667_x86_ENU
- 中国省市JSON列表
- 【阿里云镜像】配置阿里巴巴开源镜像站镜像——Epel镜像
- 史上最强Java生成chm的教程(上)
- 抖音小店开店前要准备什么?入驻流程是什么?
- 欧拉角中各种角度的名称
- 多图带您领略Windows 10 Server虚拟化平台风采
- 达内培训 Android糯米,一种用于糯米烧卖(麦)成型的内馅供料组件的制作方法...
- 为什么算法岗薪酬普遍偏高,是真的缺人才吗?
- ISO/IEC 29134
- 仿天猫 购物车(Android studio 仿天猫 详情页面 添加购物车选择 颜色 尺寸demo)
- 软件工程导论学习小结
- NVIDIA Jetson TX2 内核中添加 CP210x 串口驱动
- 微信小程序安卓视频播放卡顿问题