lambda表达式写java比较器

devtools/2025/2/7 12:24:02/

文章目录

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

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

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

java">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:按数字大小比较

java">
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 属性:

java">
import java.util.*;class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic 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()就完事儿了

java">
import java.util.*;class Person {String name;int age;Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic 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)

java">
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;}@Overridepublic 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.ppmy.cn/devtools/156799.html

相关文章

【自然语言处理】TextRank 算法提取关键词(Python实现)

文章目录 前言PageRank 实现TextRank 简单版源码实现jieba工具包实现TextRank 前言 TextRank 算法是一种基于图的排序算法&#xff0c;主要用于文本处理中的关键词提取和文本摘要。它基于图中节点之间的关系来评估节点的重要性&#xff0c;类似于 Google 的 PageRank 算法。Tex…

Java 大视界 -- Java 大数据在智能安防中的应用与创新(73)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

PFAS(全氟烷基和多氟烷基物质)测试流程详细介绍

PFAS&#xff08;全氟烷基和多氟烷基物质&#xff09;测试详细介绍 什么是PFAS&#xff1f; PFAS是(Per-and polyfluoroalkyl substances)的简称&#xff0c;中文名&#xff1a;全氟烷基和多氟烷基物质&#xff0c;是一系列合成有机氟化物的总称&#xff0c;是指至少含有一个…

【LeetCode 刷题】贪心算法(1)-基础

此博客为《代码随想录》二叉树章节的学习笔记&#xff0c;主要内容为贪心算法基础的相关题目解析。 文章目录 455.分发饼干1005.K次取反后最大化的数组和860.柠檬水找零 455.分发饼干 题目链接 class Solution:def findContentChildren(self, g: List[int], s: List[int]) -…

央行发布《贸易金融分布式账本技术要求》,参考架构包括5部分

《银行科技研究社》(作者 木子剑):2024年12月11日,中国人民银行发布金融行业标准《贸易金融分布式账本技术要求》(JR/T 0308-2024)(以下简称“《要求》”),当日实施。据悉,该文件的起草单位包括6大行和多家股份制银行等。 《要求》规定了分布式账本技术在贸易金融领域…

Hive自定义函数简介及实践案例

摘要: Hive自定义函数简介及实践 关键词: 大数据、Hive、自定义函数 整体说明 从自定义函数的简介,到自定义函数的使用类型分类和使用周期分类,以及每种自定义函数的实践案例,解决具体的需求,简单图示如下: 一、简介 允许用户扩展 Hive 的功能,以实现特定的数据处…

java 网络安全感知 网络安全学java

实验内容 1&#xff0e;掌握Socket程序的编写&#xff1b;2&#xff0e;掌握密码技术的使用&#xff1b;3&#xff0e;设计安全传输系统。 实验步骤 我的结对伙伴是宋歌,我负责的是客户端的部分。1、首先通过在对方的命令行中输入ipconfig得到服务器的ip地址。2、建立一个Soc…

力扣-字符串-344 反转字符串

思路 原地逆置&#xff0c;想到利用left和right 代码 class Solution { public:void reverseString(vector<char>& s) {int left 0, right s.size() - 1;while(left < right){char temp;temp s[left];s[left] s[right];s[right] temp; left;right--;}} };…