From 8279036a018ff0e7da4e4df2d1780937134fa061 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=A4=A7=E9=98=94?= <1520622465@qq.com>
Date: Wed, 15 Oct 2025 01:16:29 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20CollUtil#findOneByField=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E4=B8=80=E4=B8=AA=E4=BD=BF=E7=94=A8Lambda=E7=9A=84?=
=?UTF-8?q?=E5=AE=9E=E7=8E=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/hutool/core/collection/CollUtil.java | 18 ++++++++++
.../hutool/core/collection/CollUtilTest.java | 34 +++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
index 05e0d78d96..7013d54e8a 100755
--- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java
@@ -1641,6 +1641,24 @@ public class CollUtil {
});
}
+ /**
+ * 查找第一个匹配元素对象
+ * 使用 Lambda 表达式提取字段值进行匹配(类型安全、性能更好)
+ *
+ * @param 集合元素类型
+ * @param collection 集合
+ * @param fieldExtractor 用于从元素中提取字段值的函数
+ * @param fieldValue 期望匹配的字段值
+ * @return 满足条件的第一个元素
+ * @since 5.8.43
+ */
+ public static T findOneByField(Iterable collection, final Function fieldExtractor, final Object fieldValue){
+ return findOne(collection,t -> {
+ final Object value = fieldExtractor.apply(t);
+ return ObjectUtil.equal(value, fieldValue);
+ });
+ }
+
/**
* 集合中匹配规则的数量
*
diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
index 61b17a1d65..fd871f58f2 100755
--- a/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollUtilTest.java
@@ -1516,4 +1516,38 @@ public class CollUtilTest {
assertTrue(CollUtil.containsAll(coll1, coll2));
}
+
+ @Test
+ public void testFindOneByField(){
+ Animal dog = new Animal("dog", 2);
+ Animal cat = new Animal("cat", 3);
+ Animal bear = new Animal("bear", 4);
+
+ List list = new ArrayList<>();
+ list.add(dog);
+ list.add(cat);
+ list.add(bear);
+ assertEquals(CollUtil.findOneByField(list,Animal::getName,"dog"),dog);
+
+
+ // 测试map
+ Map map1 = new HashMap<>();
+ map1.put("name","dog");
+ map1.put("age","2");
+
+ Map map2 = new HashMap<>();
+ map2.put("name","cat");
+ map2.put("age","3");
+
+ Map map3 = new HashMap<>();
+ map3.put("name","bear");
+ map3.put("age","4");
+
+ List