Java使用lambda对List,Set进行排序

简介: 前言平常使用List和Set进行排序,还是很常见的,大多数的场景是对Integer,String,Long这种的排序,那么我今天先总结下难的,对一个实体类进行排序。正文首先定义一个实体类:package model;/** * 介绍人的实体类 * @author luckyharr...

前言

平常使用List和Set进行排序,还是很常见的,大多数的场景是对Integer,String,Long这种的排序,那么我今天先总结下难的,对一个实体类进行排序。

正文

首先定义一个实体类:

package model;

/**
 * 介绍人的实体类
 * @author luckyharry
 *
 */
public class Person {

    /**
     * 人名
     */
    private String name;
    
    /**
     * 人的年龄
     */
    private int age;
    
    /**
     * 人的体重
     */
    private double weight;
    
    /**
     * 人的身高
     */
    private int height;

    
    public Person(String name, int age, double weight, int height) {
        super();
        this.name = name;
        this.age = age;
        this.weight = weight;
        this.height = height;
    }

    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 double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", weight=" + weight + ", height=" + height + "]";
    }
    
    
}

然后是排序的逻辑代码

package lambda;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import model.Person;

/**
 * 对Person对象进行排序的例子
 * @author luckyharry
 *
 */
public class SortUtil {

    /*
     * Comparator是进行排序的关键所在
     * 这种排序方法首先根据person的名称 使用了String自带的一个Comparator -> CASE_INSENSITIVE_ORDER(忽略大小写,从小到大排序),
     * 如果名称相等,根据年龄,
     * 如果年龄相等,根据身高,
     * 如果身高相等,根据体重。
     * 
     * 在我看来这个比较已经是个挺复杂的了,一般情况下只根据一个属性,或者两个属性排序是大多数的情况
     * 
     * 除了comparing方法之外,还有comparingInt,comparingLong,comparingDouble可供选择。
     * thenComparing的方法种类,同上
     * 
     * 如果想进行倒序可以使用reversed()方法
     */
    private static Comparator<Person> personComparator = Comparator
            .comparing( Person::getName, String.CASE_INSENSITIVE_ORDER)
            .thenComparingInt(person -> person.getAge())
            .thenComparingInt(person -> person.getHeight())
            .thenComparingDouble(person -> person.getWeight());
    
    public static void  main(String[] args) {
        
        //对list进行排序
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("aa",15,60.00,170));
        list.add(new Person("aa",15,40.00,176));
        list.add(new Person("aa",17,66.00,174));
        list.add(new Person("aa",15,60.00,173));
        list.add(new Person("aa",14,70.00,172));
        list.add(new Person("aa",15,60.00,170));
        list.add(new Person("aa",13,80.00,175));
        list.add(new Person("aa",15,45.00,172));
        list.sort(personComparator);
        
        //对set进行排序
        Set<Person> set = new TreeSet<Person>(personComparator);
        set.add(new Person("aa",15,60.00,170));
        set.add(new Person("aa",15,40.00,176));
        set.add(new Person("aa",17,66.00,174));
        set.add(new Person("aa",15,60.00,173));
        set.add(new Person("aa",14,70.00,172));
        set.add(new Person("aa",15,60.00,170));
        set.add(new Person("aa",13,80.00,175));
        set.add(new Person("aa",15,45.00,172));
        
        
        
        System.out.println(list);
        //打印set的时候你会发现,list中打印出来了8个,而set中只有七个,是因为,有一个person对象的值,完全相同,hashcode值相等导致的
        System.out.println(set);
    }
}

需要注意和使用的地方,我已经在代码里做了注释。
顺便说一嘴,如果我们只希望排序那些基本类型的封装类,那么只需要把Compartor变得更简洁些就行,这里不再赘述。
有什么问题,可以进行评论,咱们相互之间可以进行讨论,

目录
相关文章
|
30天前
|
安全 Java API
Java中的Lambda表达式:简洁与功能的结合
Java中的Lambda表达式:简洁与功能的结合
336 211
|
2月前
|
监控 Java API
Java语言按文件创建日期排序及获取最新文件的技术
这段代码实现了文件创建时间的读取、文件列表的获取与排序以及获取最新文件的需求。它具备良好的效率和可读性,对于绝大多数处理文件属性相关的需求来说足够健壮。在实际应用中,根据具体情况,可能还需要进一步处理如访问权限不足、文件系统不支持某些属性等边界情况。
178 14
|
3月前
|
SQL JSON 安全
Java 8 + 中 Lambda 表达式与 Stream API 的应用解析
摘要:本文介绍了Java 8+核心新特性,包括Lambda表达式与Stream API的集合操作(如过滤统计)、函数式接口的自定义实现、Optional类的空值安全处理、接口默认方法与静态方法的扩展能力,以及Java 9模块化系统的组件管理。每个特性均配有典型应用场景和代码示例,如使用Stream统计字符串长度、Optional处理Map取值、模块化项目的依赖声明等,帮助开发者掌握现代Java的高效编程范式。(150字)
70 1
|
6月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
335 1
Java 中数组Array和列表List的转换
|
6月前
|
SQL Rust Java
怎么理解Java中的lambda表达式
Lambda表达式是JDK8引入的新语法,用于简化匿名内部类的代码写法。其格式为`(参数列表) -&gt; { 方法体 }`,适用于函数式接口(仅含一个抽象方法的接口)。通过Lambda表达式,代码更简洁灵活,提升Java的表达能力。
115 4
|
5月前
|
Java 编译器 API
Java Lambda 表达式:以 Foo 接口为例深入解析
本文深入解析了 Java 8 中 Lambda 表达式的用法及其背后的函数式接口原理,以 `Foo` 接口为例,展示了如何通过简洁的 Lambda 表达式替代传统匿名类实现。文章从 Lambda 基本语法、函数式接口定义到实际应用层层递进,并探讨默认方法与静态方法的扩展性,最后总结常见误区与关键点,助你高效优化代码!
123 0
|
8月前
|
前端开发 JavaScript UED
React 拖拽排序组件 Draggable List
在现代Web应用中,拖拽排序功能显著提升用户体验。使用React结合`react-dnd`库,可以轻松创建高效且易于维护的拖拽排序组件。通过简单的拖拽操作,用户能直观调整列表项顺序,适用于任务管理、看板工具等场景。实现步骤包括项目初始化、安装依赖、创建基础组件、添加拖拽功能及管理状态和事件。常见问题如拖拽效果不流畅、顺序未更新等可通过性能优化、正确处理索引交换等方式解决。移动端支持也需考虑,确保跨平台的良好体验。
545 25
|
8月前
|
Java 程序员
Java 排序神器:Comparable 和 Comparator 该怎么选?
嗨,大家好,我是小米!今天和大家聊一聊Java社招面试中常考的经典问题——Comparable和Comparator的区别。Comparable定义对象的自然排序,适用于单一固定的排序规则;Comparator则是策略接口,用于定义自定义排序规则,适用于多样化或多变的排序需求。掌握这两者的区别是理解Java排序机制的基础,也是面试中的加分题。结合实际项目场景深入探讨它们的应用,能更好地打动面试官。如果你觉得有帮助,欢迎点赞、收藏、分享,期待你的一键三连!我们下期见~ 我是小米,一个喜欢分享技术的程序员,关注我的微信公众号“软件求生”,获取更多技术干货!
103 20
|
9月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
164 20