java用lambda函数排序,Java8:使用Lambda表达式增强版Comparator排序

本文详细介绍了Java8中Lambda表达式如何用于Comparator,包括基本排序、类型定义简化、静态方法引用、多条件排序以及反转排序等多种场景,展示了Lambda表达式在提高代码简洁性和可读性方面的优势。
摘要由CSDN通过智能技术生成

学习路上的自我记录-------路好长,就问你慌不慌,大声港,不慌。----jstarseven。

实体类:

package com.server.model;

/**

* Created by jstarseven on 2016/3/21.

*/

public class Human {

private String name;

private int age;

@Override

public String toString() {

return "Human{" +

"name='" + name + '\'' +

", age=" + age +

'}';

}

public Human() {

super();

}

public Human(final String name, final int age) {

super();

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public static int compareByNameThenAge(Human lhs, Human rhs) {

if (lhs.getName().equals(rhs.getName())) {

return lhs.getAge() - rhs.getAge();

} else {

return lhs.getName().compareTo(rhs.getName());

}

}

}

测试类:

package com.server.lambda;

import com.server.model.Human;

import org.junit.Test;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

* Created by jstarseven on 2016/3/21.

*/

public class TestLambda {

// 不使用Lambda表达式的基本排序

@Test

public void givenPreLambda_whenSortingEntitiesByName_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

Collections.sort(humans, new Comparator() {

public int compare(Human o1, Human o2) {

return o1.getName().compareTo(o2.getName());

}

});

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 使用Lambda表达式的基本排序

@Test

public void whenSortingEntitiesByName_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

humans.sort((Human h1, Human h2) -> h1.getName().compareTo(h2.getName()));

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 没有类型定义( Type Definitions)的基本排序

@Test

public void givenLambdaShortForm_whenSortingEntitiesByName_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

humans.sort((h1, h2) -> h1.getName().compareTo(h2.getName()));

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 使用静态方法的引用来排序

@Test

public void givenMethodDefinition_whenSortingEntitiesByNameThenAge_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

humans.sort(Human::compareByNameThenAge);

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 提取Comparator进行排序

@Test

public void givenInstanceMethod_whenSortingEntitiesByNameThenAge_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

Collections.sort(humans, Comparator.comparing(Human::getName));

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 反转排序

@Test

public void whenSortingEntitiesByNameReversed_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

Comparator comparator = (h1, h2) -> h1.getName().compareTo(h2.getName());

humans.sort(comparator.reversed());

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 多条件排序

@Test

public void whenSortingEntitiesByNameThenAge_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

humans.sort((lhs, rhs) -> {

if (lhs.getName().equals(rhs.getName())) {

return lhs.getAge() - rhs.getAge();

} else {

return lhs.getName().compareTo(rhs.getName());

}

});

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

// 多条件组合排序

@Test

public void givenComposition_whenSortingEntitiesByNameThenAge_thenCorrectlySorted() {

List humans = new ArrayList();

humans.add(new Human("A", 10));

humans.add(new Human("C", 14));

humans.add(new Human("C", 12));

humans.add(new Human("B", 12));

humans.sort(Comparator.comparing(Human::getName).thenComparing(Human::getAge));

for (Human bean : humans) {

System.out.println(bean.toString());

}

}

}

-END-

Java8:Lambda表达式增强版Comparator和排序

1.概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排 ...

Java8 Collections.sort()及Arrays.sort()中Lambda表达式及增强版Comparator的使用

摘要:本文主要介绍Java8 中Arrays.sort()及Collections.sort()中Lambda表达式及增强版Comparator的使用. 不废话直接上代码 import com.goo ...

java8的lambda表达式,将List<DTO> 转为 List<DO>

将List转为List,通过java8的lambda表达式来操作,比传统的for循环精简很多: /** * List

Java8中Lambda表达式的10个例子

Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 //Before Java 8: new Thread(new Runnable() { @Overri ...

java8之lambda表达式(1)-基本语法

lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) class Student{ private String name; private Double ...

java8之lambda表达式入门

1.基本介绍 lambda表达式,即带有参数的表达式,为了更清晰地理解lambda表达式,先上代码: 1.1 两种方式的对比 1.1.1 方式1-匿名内部类 class Student{ privat ...

JAVA8之lambda表达式具体解释,及stream中的lambda使用

前言: 本人也是学习lambda不久,可能有些地方描写叙述有误,还请大家谅解及指正! lambda表达式具体解释 一.问题 1.什么是lambda表达式? 2.lambda表达式用来干什么的? 3.l ...

java8中Lambda表达式和Stream API

一.Lambda表达式 1.语法格式 Lambda是匿名函数,可以传递代码.使用“->”操作符,改操作符将lambda分成两部分: 左侧:指定了 Lambda 表达式需要的所有参数 右侧:指定了 ...

Java8的lambda表达式和Stream API

一直在用JDK8 ,却从未用过Stream,为了对数组或集合进行一些排序.过滤或数据处理,只会写for循环或者foreach,这就是我曾经的一个写照. 刚开始写写是打基础,但写的多了,各种乏味,非过来 ...

随机推荐

html学习第三天—— 第12章——css布局模型

清楚了CSS 盒模型的基本概念. 盒模型类型, 我们就可以深入探讨网页布局的基本模型了.布局模型与盒模型一样都是 CSS 最基本. 最核心的概念. 但布局模型是建立在盒模型基础之上,又不同于我们常说的 ...

Python学习之collections module-defaultdict()

defaultdict()继承自dict系统内置类型defaultdict()定义以及作用:    返回一个和dictionay类似对象,和dict不同:      1. 可以制定key对应value ...

XV Open Cup named after E.V. Pankratiev. GP of Siberia-Swimming

给出两个点,找到过这两个点的等角螺线,并求出中间的螺线长 $c = \frac{b}{a}$ $p = a \times c^{\frac{\theta}{angle}}$ 对弧线积分 #includ ...

为tomcat配置项目必须的引擎文件

1.如下图所示,红框圈出来的四个语音引擎文件是直接放在项目根目录下的,这样的话我们发布web应用的时候,项目并不能自动把这几个文件打包到tomcat中, 除非放到WebRoot文件夹下,但是这样的话项 ...

在相应目录下新建或读取xml文件

string path = AppDomain.CurrentDomain.BaseDirectory+"UserContent1.xml"; //判断相应路径下文件是否存在 不存 ...

JAVA实现长连接(含心跳检测)Demo

实现原理: 长连接的维持,是要客户端程序,定时向服务端程序,发送一个维持连接包的.       如果,长时间未发送维持连接包,服务端程序将断开连接. 客户端:       Client通过持有Sock ...

git 设置只输入一次用户名和密码

https方式每次都要输入密码,非常不爽 按照如下设置可只输入一次 记住密码(默认15分钟): git config --global credential.helper cache 自己定义时间(一 ...

iis+php(FastCGI)

1. 安装 IIS 时选择添加 CGI 功能 2. 安装 PHP, 2.1 下载 nts 版本 (非线程安全版本) zip 压缩包,下载对应的 vc++ 运行时(php官网下载页面左侧有下载链接) 2 ...

如何用C#对Gridview的项目进行汇总统计?

上一次用了javascript对gridview进行了汇总统计,但那个统计是在客户端进行的,虽然减轻了服务器的负担,但是,当需要把统计信息汇出excel时,汇总信息却死活不出来了,所以,绕半天又绕回来 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值