Comparator 比较器

在Java中,Comparator.comparingInt(String::length) 是一个用于创建比较器(Comparator)的静态方法调用,它的核心作用是定义一个比较规则,使对象按照特定属性(这里是字符串长度)进行比较。下面从基础概念方法解析代码示例常见应用四个方面详细解释:

一、基础概念:Comparator接口

1. Comparator接口的作用

Comparator 是Java中的一个函数式接口(位于java.util包),用于定义对象之间的比较规则。它允许你在不修改对象类的前提下,自定义排序逻辑。

2. 核心方法
  • int compare(T o1, T o2):比较两个对象的大小,返回值规则:
    • 负数o1 小于 o2
    • o1 等于 o2
    • 正数o1 大于 o2

二、方法解析:Comparator.comparingInt(String::length)

1. 静态工厂方法 comparingInt()

Comparator.comparingInt() 是Java 8引入的静态方法,用于创建基于int类型属性的比较器。它的语法为:

public static <T> Comparator<T> comparingInt(ToIntFunction<? super T> keyExtractor)
  • 参数keyExtractor 是一个函数式接口,用于从对象中提取int类型的属性值。
  • 返回值:返回一个按照该属性值进行比较的Comparator
2. 方法引用 String::length

String::length 是Java 8的方法引用语法,等价于lambda表达式 s -> s.length(),表示从字符串对象中提取长度值(int类型)。

3. 完整逻辑拆解
Comparator.comparingInt(String::length)

等价于:

Comparator<String> comparator = (s1, s2) -> s1.length() - s2.length();

即:按照字符串的长度从小到大排序。

三、代码示例:使用 comparingInt 排序

1. 对字符串列表按长度排序
import java.util.Arrays;
import java.util.List;public class ComparatorExample {public static void main(String[] args) {List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");// 使用 comparingInt 按字符串长度排序names.sort(Comparator.comparingInt(String::length));// 输出结果:[Bob, Dave, Alice, Charlie]System.out.println(names);}
}
2. 自定义对象按属性排序

假设存在Person类,包含nameage属性:

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public int getAge() {return age;}@Overridepublic String toString() {return name + "(" + age + ")";}
}public class CustomObjectSorting {public static void main(String[] args) {List<Person> people = Arrays.asList(new Person("Alice", 25),new Person("Bob", 20),new Person("Charlie", 30));// 按年龄排序people.sort(Comparator.comparingInt(Person::getAge));// 输出结果:[Bob(20), Alice(25), Charlie(30)]System.out.println(people);}
}

四、进阶用法:组合比较器

1. 逆序排序
// 按字符串长度从大到小排序
names.sort(Comparator.comparingInt(String::length).reversed());
2. 多级排序(先长度,再字典序)
names.sort(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));

五、常见应用场景

  1. 集合排序:对列表、数组等集合按自定义规则排序。
  2. Stream API:在流操作中对元素进行排序。
names.stream().sorted(Comparator.comparingInt(String::length)).forEach(System.out::println);
  1. 自定义排序规则:在TreeSet、TreeMap中使用。
// 创建按长度排序的TreeSet
TreeSet<String> set = new TreeSet<>(Comparator.comparingInt(String::length));

六、与其他比较器方法的对比

方法适用场景示例
comparing对象属性为任意类型comparing(Person::getName)
comparingInt对象属性为int类型comparingInt(Person::getAge)
comparingLong对象属性为long类型comparingLong(Order::getAmount)
comparingDouble对象属性为double类型comparingDouble(Product::getPrice)

总结

Comparator.comparingInt(String::length) 的本质是:创建一个比较器,通过提取字符串的长度(int值)来比较字符串大小。这种方式既简洁又高效,避免了手动实现Comparator接口的繁琐,是Java 8函数式编程的典型应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人设备遥控器之无线通讯技术篇

无人设备遥控器的无线通讯技术是确保遥控操作准确、稳定、高效进行的关键。以下是对无人设备遥控器无线通讯技术的详细解析&#xff1a; 一、主要无线通讯技术类型 Wi-Fi通讯技术 原理&#xff1a;基于IEEE 802.11标准&#xff0c;通过无线接入点&#xff08;AP&#xff09;…

Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)

Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;七&#xff09; 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal&#xff0c;Kotlin&#xff08;六&#xff09;-CSDN博客 的基础上改进&#xff0c;主要是…

ET EntityRef EntityWeakRef 类分析

EntityRef EntityWeakRef 相同点 也是这两个的作用&#xff1a;这两个都是用来表示一个实体引用。一般来说使用一个对象&#xff0c;直接持有对象就可以&#xff0c;但是如果对象来自于对象池&#xff0c;这个时候直接持有对象不合适&#xff0c;对象可能已经被对象池回收&…

基于Leaflet和天地图的免费运动场所WebGIS可视化-以长沙市为例

目录 前言 一、免费运动场所数据整理 1、本地宝数据简介 2、Java后台数据解析 二、Leaflet前端地图展示 1、基础数据准备 2、具体位置及属性标记 三、成果展示 1、空间位置分布 2、东风路立交桥运动公园 3、芙蓉区花侯路浏阳河大桥下方 4、梅岭国际小区 5、湖南大学…

Flutter——数据库Drift开发详细教程(六)

目录 1.视图2.视图中列的可空性3.DAO4.流查询5.高级用途6.注意事项 1.视图 也可以将SQL 视图定义 为 Dart 类。为此&#xff0c;请编写一个抽象类来扩展View。此示例声明了一个视图&#xff0c;用于读取示例中架构中某个类别中添加的待办事项数量&#xff1a; abstract class C…

Kafka 4.0版本的推出:数据处理新纪元的破晓之光

之前做大数据相关项目&#xff0c;在项目中都使用过kafka。在数字化时代&#xff0c;数据如洪流般涌来&#xff0c;如何高效处理这些数据成为关键。Kafka 就像是一条 “智能数据管道”&#xff0c;在数据的世界里扮演着至关重要的角色。如果你第一次接触它&#xff0c;不妨把它…

RabbitMQ高级篇-MQ的可靠性

目录 MQ的可靠性 1.如何设置数据持久化 1.1.交换机持久化 1.2.队列持久化 1.3.消息持久化 2.消息持久化 队列持久化&#xff1a; 消息持久化&#xff1a; 3.非消息持久化 非持久化队列&#xff1a; 非持久化消息&#xff1a; 4.消息的存储机制 4.1持久化消息&…

ctfshow权限维持

1&#xff0c;web670 我们先看一下这个php代码 error_reporting(0);#关闭错误报告 highlight_file(__FILE__);#内容高亮显示$a$_GET[action];#get传参switch($a){case cmd:eval($_POST[cmd]);break;case check:file_get_contents("http://checker/api/check");#获取…

力扣算法ing(71 / 100)

5.15 哈希表合集—349.两个数组的交集 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例…

(面试)Handler消息处理机制原理

Handler是用于实现线程间通信和任务调度的一种机&#xff08;Handler、 Looper、MessageQueue、 Message&#xff09;。Handler 允许线程间发送Message或Runnable对象进行通信。在Android中UI修改只能通过UI Thread&#xff0c;子线程不能更新UI。如果子线程想更新UI&#xff0…

Dify 实战教程 | 5分钟打造文本生成应用( Stable Diffusion 提示词生成器)

AI 绘画离不开「提示词&#xff08;Prompt&#xff09;」——如何构造清晰、生动、有表现力的提示词&#xff0c;直接决定你生成图像的质量。而 Stable Diffusion 的提示词构造相比 Midjourney 更加自由&#xff0c;但也更考验组织语言的能力。 今天这篇教程&#xff0c;教你零…

RPC框架源码分析学习(二)

RPC框架源码分析与原理解读 前言 在分布式系统开发中&#xff0c;远程过程调用(RPC)是一项基础且关键的技术。通过对KVstorageBaseRaft-cpp项目RPC模块的源码分析&#xff0c;我深入理解了RPC框架的工作原理和实现细节。本文将从程序员视角分享我的学习心得。 框架概述 本项…

当下流行的智能体通信协议:MCP、A2A、ANP 分别是什么?

在当前人工智能&#xff08;AI&#xff09;智能体生态系统中&#xff0c;智能体之间的有效沟通至关重要。为了让AI智能体能够高效、安全地协同工作&#xff0c;业界提出了多种通信协议。其中&#xff0c;MCP、A2A 和 ANP 代表了三个关键层级的通信协议&#xff0c;各自应对不同…

为什么 cout<<“中文你好“ 能正常输出中文

一, 简答: 受python3字符串模型影响得出的下文C字符串模型结论 是错的&#xff01;C的字符串和python2的字符串模型类似&#xff0c;也就是普通的字符串是ASCII字符串和字节串两种语义&#xff0c;类似重载或多态&#xff0c;有时候解释为整数&#xff0c;有时候是字节串。Uni…

鸿蒙的卓易通,让我踩了一次坑

前言 因为我本身对鸿蒙提不起兴趣&#xff0c;哪怕有些文章给鸿蒙穿上了“黑丝”&#xff0c;再加上公司当前没有适配鸿蒙的计划&#xff0c;所以关于鸿蒙的消息我都关注的很少。 今早&#xff0c;看到了徐宜生老师的一篇文章&#xff1a;“鸿蒙卓易通&#xff0c;是饮鸩止渴…

Cursor vs VS Code vs Zed

代码编辑器的世界已经迎来了创新的爆发。曾经由重量级IDE或基础文本编辑器主导的领域,如今开发者们发现自己正在探索全新一波聚焦于AI集成、协作和性能的工具。 在本文中,我们将深入探讨2025年三款流行的编辑器:Cursor、Visual Studio Code (VS Code)和Zed Code Editor。每…

使用 LiteFlow 实现灵活的业务逻辑解耦

1. 引言 1.1 业务逻辑复杂性带来的挑战 在现代软件开发中,随着业务需求不断增长,代码结构日趋复杂。硬编码式的流程控制方式难以适应频繁变更的需求,导致维护成本高、可读性差、扩展性弱。 1.2 规则引擎在解耦中的作用 规则引擎(Rule Engine)通过将业务逻辑与程序代码…

以项目的方式学QT开发(一)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!

以项目的方式学QT开发 以项目的方式学QT开发 P1 QT介绍 1.1 QT简介 1.2 QT安装 1.2.1 Windows QT安装 1.2.2 QT Creator 使用基本介绍 P2 C基础 2.1 命名空间 2.1.1 命名空间作用 2.1.2 自定义命名空间 2.2 从C语言快速入门 2.2.1 输入输出 2.2.2 基…

【前端】【css】【总复习】三万字详解CSS 知识体系

&#x1f308; CSS 知识体系目录大纲 一、基础知识入门 1. CSS 简介与作用 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种用于给 HTML 页面添加样式的语言&#xff0c;作用是让网页更美观、结构更清晰、布局更灵活。 核心作用&#xff1a;…

R利用spaa包计算植物/微生物的生态位宽度和重叠指数

一、生态位宽度 生态位宽度指数包括shannon生态位指数和levins生态位指数。下面是采用levins方法计算生态位宽度。method也可以选择“shannon”。 二、生态位重叠指数 生态位重叠指数&#xff0c;包括levins生态位重叠指数、schoener生态位重叠指数、petrai…