java8新特性_java8新特性 Java 8 新特性教程(全面介绍共40篇) - 闪电教程JSRUN

本套JAVA8教程暂时有大量英文内容, 中文翻译工作正在进行中。

> 如果你愿意翻译其中的小部份的内容,我们非常感谢你的付出。 而且操作非常简单, 你只需要标题附近的"修改教程"按钮然后就可以修改和保存了

,不用担心被改坏了,我们后台有强大的对比审核工具,会确保教程的准确性。

Lambda表达式 : 排序例子

在这个例子中,我们将向你展示如何使用 Java 8 Lambda 表达式去书写一个 Comparator 来对一个List排序.

传统 Comparator 例子.

Comparator byName = new Comparator() {

@Override

public int compare(Developer o1, Developer o2) {

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

}

};Lambda 表达式这样操作.

Comparator byName =

(Developer o1, Developer o2)->o1.getName().compareTo(o2.getName());

1. 不使用Lambda来排序

使用 age 来比较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 listDevs = getDevelopers();

System.out.println("Before Sort");

for (Developer developer : listDevs) {

System.out.println(developer);

}

//通过名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;

}

}

Output

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 类来实现 :

//通过age排序

Collections.sort(listDevs, new Comparator() {

@Override

public int compare(Developer o1, Developer o2) {

return o1.getAge() - o2.getAge();

}

});

//通过name排序

Collections.sort(listDevs, new Comparator() {

@Override

public int compare(Developer o1, Developer o2) {

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

}

});

//通过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()

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 表达式!

listDevs.sort((Developer o1, Developer o2)->o1.getAge()-o2.getAge());

//java 8 , lambda也可以打印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;

}

}

Output

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 通过age排序

//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, 泛型参数

listDevs.sort((o1, o2)->o1.getAge()-o2.getAge());

3.2 通过name排序

//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()));

3.3 通过salary排序

//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()));

3.4 颠倒排序.

3.4.1 Lambda 表达式通过salary排序.

Comparator 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 表达式通过salary倒序排序.

Comparator 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]

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值