当前位置: 首页 > article >正文

lambda表达式写java比较器

文章目录

  • 示例 1:按字符串长度比较
  • 示例 2:按数字大小比较
  • 示例 3:按对象属性比较
  • (简洁:推荐)示例 4:使用 Comparator 的静态方法
  • 示例 5:链式比较

在Java中,Comparator 是一个函数式接口,可以使用 Lambda 表达式来实现。Lambda 表达式提供了一种简洁的方式来定义匿名的比较器,而无需显式实现 Comparator 接口。
以下是一些使用 Lambda 表达式编写 Comparator 的示例:

示例 1:按字符串长度比较

import java.util.Arrays;
import java.util.Comparator;

public class LambdaComparatorExample {
    public static void main(String[] args) {
        String[] words = {"apple", "banana", "cherry", "date"};

        // 使用 Lambda 表达式按字符串长度升序排序
        Arrays.sort(words, (s1, s2) -> s1.length() - s2.length());
		//等价于Arrays.sort(words, Comparator.comparing(String::length));
        System.out.println(Arrays.toString(words)); // 输出:[date, apple, banana, cherry]
    }
}

示例 2:按数字大小比较


import java.util.Arrays;
import java.util.Comparator;

public class LambdaComparatorExample {
    public static void main(String[] args) {
        Integer[] numbers = {5, 2, 9, 1, 5, 6};

        // 使用 Lambda 表达式按数字升序排序
        Arrays.sort(numbers, (n1, n2) -> n1.compareTo(n2));

        System.out.println(Arrays.toString(numbers)); // 输出:[1, 2, 5, 5, 6, 9]
    }
}

示例 3:按对象属性比较

假设有一个 Person 类,包含 name 和 age 属性:


import java.util.*;

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}

public class LambdaComparatorExample {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Charlie", 35)
        );

        // 按年龄升序排序
        people.sort((p1, p2) -> p1.age - p2.age);

        // 按年龄降序排序
        people.sort((p1, p2) -> p2.age - p1.age);

        // 按姓名升序排序
        people.sort(Comparator.comparing(p -> p.name));

        System.out.println(people); // 输出:[Alice: 30, Bob: 25, Charlie: 35]
    }
}

(简洁:推荐)示例 4:使用 Comparator 的静态方法

Java 8 引入了 Comparator 的一些静态方法,可以更简洁地实现比较器:
Comparator实现逆序很简单,就是加一个 .reversed()就完事儿了


import java.util.*;

class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}

public class LambdaComparatorExample {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Charlie", 35)
        );

        // 按年龄升序排序
        people.sort(Comparator.comparing(Person::getAge));
		//效果一样people.sort(Comparator.comparing(p -> p.age));
        // 按年龄降序排序
        //people.sort(Comparator.comparingInt(p -> p.age).reversed());

        // 按姓名升序排序
        //people.sort(Comparator.comparing(p -> p.name));

        System.out.println(people); 
    }
}

示例 5:链式比较

如果需要按多个属性进行排序,可以使用 Comparator 的 thenComparing 方法:
可以链式调用继续 thenComparing(XXXClass::getXXX)就完事儿了,比如比较字符串长度就是 thenComparing(String::length),比较其他就是 thenComparing(XXXClass::getXXX)


package AAA;

import java.util.*;
class Person {
    public String name;
    public int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return name + ": " + age;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Alice", 30),
                new Person("Bob", 25),
                new Person("Alice", 20)
        );
        people.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));



        System.out.println(people); // 输出:[Alice: 20, Bob: 25, Alice: 30]
    }
}



总结
使用 Lambda 表达式编写 Comparator 可以让代码更加简洁和易读。通过结合 Comparator 的静态方法(如 comparing、comparingInt、reversed、thenComparing 等),可以实现复杂的排序逻辑,而无需手动实现 Comparator 接口。


http://www.kler.cn/a/534620.html

相关文章:

  • AllData数据中台核心菜单十二:数据同步平台
  • android 自定义通话录音
  • NeetCode刷题第21天(2025.2.4)
  • Java BIO详解
  • Flink2支持提交StreamGraph到Flink集群
  • Java集合框架
  • deepseek技术细节1
  • 线程池如何知道一个线程的任务已经执行完成
  • 调用腾讯云批量文本翻译API翻译srt字幕
  • Text2Sql:开启自然语言与数据库交互新时代(3030)
  • postgresql-COALESCE函数、NULLIF函数、NVL函数使用
  • 腾讯云 TI 平台部署与调用DeepSeek-R1大模型的实战指南
  • docker常用基础
  • 【极简模式】deepseek文案+剪映图文成片
  • 使用媒体查询确保网页能够在手机、平板和电脑上正常浏览
  • AI回答 | spring,springboot,spring MVC,servlet, spring web之间的联系与支持
  • Java面试:a+=a-=aa原理解析
  • 国产编辑器EverEdit - 工具栏说明
  • SpringBoot 整合 Mybatis:注解版
  • 深度学习|表示学习|卷积神经网络|NIN 相比普通 CNN|17
  • mysql慢查询工具explain
  • MySQL 的 binlog 作用
  • 11.10 LangChain对话记忆管理实战:从入门到生产级ConversationBufferMemory应用指南
  • 查看设备uuid
  • 【EdgeAI实战】(2)STM32 AI 扩展包的安装与使用
  • 【技术追踪】DiffMIC:用于医学图像分类的双引导扩散网络(MICCAI-2024)