服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java8的Lambda和排序

Java8的Lambda和排序

2022-03-11 10:59banq Java教程

这篇文章主要介绍了Java8的Lambda和排序,对数组和集合进行排序是Java 8 lambda令人惊奇的一个应用,我们可以实现一个Comparators来实现各种排序,下面文章将有案例详细说明,想要了解得小伙伴可以参考一下

对数组和集合进行排序是Java 8 lambda令人惊奇的一个应用,我们可以实现一个Comparators来实现各种排序。

看下面案例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
static class Person {
 
    final String firstName;
 
    final String lastName;
 
 
  
    Person(String firstName, String lastName) {
 
        this.firstName = firstName;
 
        this.lastName = lastName;
 
    }
 
 
 
    @Override
 
    public String toString() {
 
        return "Person{" +
 
                "firstName='" + firstName + '\'' +
 
                ", lastName='" + lastName + '\'' +
 
                '}';
 
    }
 
}

Person的数据有:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
List<Person> people =
 
Arrays.asList(
 
    new Person("Jane", "Henderson"),
 
    new Person("Michael", "White"),
 
    new Person("Henry", "Brighton"),
 
    new Person("Hannah", "Plowman"),
 
    new Person("William", "Henderson")
 
);

我们希望根据名字排序(last name),然后再根据姓(first name)排序。

在Java 7之前,我们通常是通过实现一个Comparator:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
people.sort(new Comparator<Person>() {
 
  @Override
 
  public int compare(Person o1, Person o2) {
 
    int result = o1.lastName.compareTo(o2.lastName);
 
 
 
    if (result == 0)
 
      result = o1.firstName.compareTo(o2.firstName);
 
 
 
    return result;
 
  }
 
});
 
people.forEach(System.out::println);

而在Java 8中,我们可以使用lambda替代匿名函数,如下:

?
1
2
3
4
5
6
7
8
9
10
11
Comparator<Person> c = (p, o) -> p.lastName.compareTo(o.lastName);
 
 
 
c = c.thenComparing((p, o) -> p.firstName.compareTo(o.firstName));
 
 
 
people.sort(c);
 
people.forEach(System.out::println);

在这里,Lambda表达式 (p, o) -> p.lastName.compareTo(o.lastName)替代之前的匿名函数new Comparator<Person>() {}

因为Java编译器并不能推迟对Lambda表达式类型判断,比如延迟到将comparator传递到sort()方法,因此使得我们进行链式Comparator书写有点困难,

比如我们想写成如下:

?
1
2
XXX.thenComparing((p, o) -> p.lastName.compareTo(o.lastName))
       .thenComparing((p, o) -> p.firstName.compareTo(o.firstName))

换句话说,类型判断是从左到右,而不是从右到左,我们可以通过创建一个泛型来进行类型推断:

?
1
2
3
4
5
6
7
8
9
class Utils {
 
    static <E> Comparator<E> compare() {
 
        return (e1, e2) -> 0;
 
    }
 
}

通过上面的compare()方法,我们可以书写流畅的comparator链:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
people.sort(
 
    Utils.<Person>compare()
 
         .thenComparing((p, o) ->
 
              p.lastName.compareTo(o.lastName))
 
         .thenComparing((p, o) ->
 
              p.firstName.compareTo(o.firstName))
 
);
 
 
 
people.forEach(System.out::println);

到此这篇关于Java8的Lambda和排序的文章就介绍到这了,更多相关Java Lambda和排序内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.jdon.com/idea/java/java-8-lambdas-sorting.html

延伸 · 阅读

精彩推荐
  • Java教程解决@RequestBody使用不能class类型匹配的问题

    解决@RequestBody使用不能class类型匹配的问题

    这篇文章主要介绍了解决@RequestBody使用不能class类型匹配的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    二傻逼3572021-10-09
  • Java教程详解Java 集合系列(三)—— LinkedList

    详解Java 集合系列(三)—— LinkedList

    这篇文章主要介绍了Java 集合系列(三)—— LinkedList,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们...

    那一叶随风4872021-07-27
  • Java教程利用Redis实现延时处理的方法实例

    利用Redis实现延时处理的方法实例

    这篇文章主要给大家介绍了关于利用Redis实现延时处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用Redis具有一定的参考学习价值...

    我一定会有猫的8022021-07-20
  • Java教程深入分析java并发编程中volatile的实现原理

    深入分析java并发编程中volatile的实现原理

    这篇文章主要介绍了深入分析java并发编程中Volatile的实现原理,涉及Volatile的官方定义,实现原理,使用优化等相关内容,具有一定参考价值,需要的朋友...

    方腾飞9862021-02-06
  • Java教程Java代码实现随机生成汉字的方法

    Java代码实现随机生成汉字的方法

    今天小编就为大家分享一篇关于Java代码实现随机生成汉字的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    徐刘根7932021-07-26
  • Java教程Java装饰者模式实例详解

    Java装饰者模式实例详解

    这篇文章主要介绍了Java装饰者模式,结合实例形式详细分析了装饰着模式的原理与java具体实现技巧,需要的朋友可以参考下...

    Qian-Z9022020-12-26
  • Java教程Java简单实现约瑟夫环算法示例

    Java简单实现约瑟夫环算法示例

    这篇文章主要介绍了Java简单实现约瑟夫环算法,简单描述了约瑟夫环问题,并结合实例形式分析了Java实现约瑟夫环的具体操作技巧,需要的朋友可以参考下...

    perfect亮10602021-01-01
  • Java教程@PathVariable为空时指定默认值的操作

    @PathVariable为空时指定默认值的操作

    这篇文章主要介绍了@PathVariable为空时指定默认值的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    csdnluolei10642021-08-14