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 05e0d78d962e34c205e5e232a1610f77e6ca9512..7013d54e8aa3703a805dfa956fd84b11f03f0b87 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 61b17a1d652b757bcd22da6a4a6f11b3ca492fc8..fd871f58f2026c90214d3795ff06248b3be07616 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> mapList = new ArrayList<>(); + mapList.add(map1); + mapList.add(map2); + mapList.add(map3); + assertEquals(CollUtil.findOneByField(mapList,map->map.get("name"),"bear"),map3); + + } }