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 示例相关推荐

  1. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  2. Java 8 Lambda表达式10个示例【存】

    PS:不能完全参考文章的代码,请参考这个文件http://files.cnblogs.com/files/AIThink/Test01.zip 在Java 8之前,如果想将行为传入函数,仅有的选择就是 ...

  3. 深圳Java培训学习:Java8.0新特性之Lambda表达式--【千锋】

    深圳Java培训学习:Java8.0新特性之Lambda表达式–[千锋] 前言 Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级.本篇文章,主要给大家介绍的是lambda表 ...

  4. JAVA语言-比较器Comparator(java中Comparable和Comparator的区别)

    文章目录 一.什么是Comparator 二.Java compare方法和compareTo方法 三.java中Comparable和Comparator的区别 Comparator的例子 三.de ...

  5. JAVA复合判断_一起来学Java8(四)——复合Lambda

    在一起来学Java8(二)--Lambda表达式中我们学习了Lambda表达式的基本用法,现在来了解下复合Lambda. Lambda表达式的的书写离不开函数式接口,复合Lambda的意思是在使用La ...

  6. Java Comparator源码总结 Comparator源码注释翻译和解析中英文对照版

    版本 JDK8(JDK1.8) Comparator接口重点 1.Comparator接口是一个函数式接口,里面只有一个虚方法compare(T o1, T o2),该接口表示一个比较器,而实现Com ...

  7. Java学习(90)Java集合排序——Comparator接口介绍、案例:对宠物猫分别按名字升序、年龄降序进行排列

    Java集合排序--Comparator接口介绍.案例:对宠物猫分别按名字升序.年龄降序进行排列 Comparator接口介绍 1. Comparator接口: 2. Comparator接口中的co ...

  8. java map comparator,Java TreeMap comparator()方法

    Java TreeMap comparator()方法 java.util.TreeMap.comparator() 返回按顺序排列键的比较器:如果映射使用自然顺序,则返回null. 1 语法 pub ...

  9. Java创建comparator对象,Java Comparable 和 Comparator 的详解及区别

    Java Comparable 和 Comparator 的详解及区别 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢?今天来了解一下. C ...

最新文章

  1. python多线程输出_Python多线程
  2. Leetcode 242. 有效的字母异位词 解题思路及C++实现
  3. python 权限修饰符
  4. RocketMQ消息支持的模式-消息异步发送
  5. cocos中如何让背景模糊_Cocos2d-x shader学习2: 模糊(Blur)
  6. #西柚姨妈体#蹿红微博 流行体之风重袭网络
  7. WindowsXP_KB909667_x86_ENU
  8. 中国省市JSON列表
  9. 【阿里云镜像】配置阿里巴巴开源镜像站镜像——Epel镜像
  10. 史上最强Java生成chm的教程(上)
  11. 抖音小店开店前要准备什么?入驻流程是什么?
  12. 欧拉角中各种角度的名称
  13. 多图带您领略Windows 10 Server虚拟化平台风采
  14. 达内培训 Android糯米,一种用于糯米烧卖(麦)成型的内馅供料组件的制作方法...
  15. 为什么算法岗薪酬普遍偏高,是真的缺人才吗?
  16. ISO/IEC 29134
  17. 仿天猫 购物车(Android studio 仿天猫 详情页面 添加购物车选择 颜色 尺寸demo)
  18. 软件工程导论学习小结
  19. NVIDIA Jetson TX2 内核中添加 CP210x 串口驱动
  20. 微信小程序安卓视频播放卡顿问题

热门文章

  1. python中的set集合_python-数据类型之set集合
  2. 规格书-蓝牙模组-xmBLE-17H66B2
  3. proxyTable配置
  4. 2022强网杯 Quals Reverse 部分writeup
  5. 软考高项(第四版)十五至尊图最新总结
  6. 优秀架构师必须掌握的架构思维 1
  7. 人脸识别(2)----调用百度人脸识别API
  8. led调光原理c语言,最牛的LED遥控控制器---调整无闪烁(C语言)
  9. Web前端学习记录——CSS3过渡属性+定位实现简单的动画效果
  10. iperf 测试网络试用