From a1f8a9e09345dea6455bf57c2b2dadceef45df8c Mon Sep 17 00:00:00 2001 From: youzipi Date: Mon, 13 Mar 2023 16:22:52 +0800 Subject: [PATCH] feat: CollUtil add groupByFunc --- .../cn/hutool/core/collection/CollUtil.java | 14 +++++++----- .../hutool/core/collection/CollUtilTest.java | 22 ++++++++++++++++++- 2 files changed, 30 insertions(+), 6 deletions(-) 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 3ac2129fd..a660dd112 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 @@ -2023,8 +2023,12 @@ public class CollUtil { * @return 分组列表 */ public static List> groupByField(final Collection collection, final String fieldName) { + return groupByFunc(collection, t -> BeanUtil.getFieldValue(t, fieldName)); + } + + public static List> groupByFunc(final Collection collection, final Function getter) { return group(collection, new Hash32() { - private final List fieldNameList = new ArrayList<>(); + private final List hashValList = new ArrayList<>(); @Override public int hash32(final T t) { @@ -2032,11 +2036,11 @@ public class CollUtil { // 非Bean放在同一子分组中 return 0; } - final Object value = FieldUtil.getFieldValue(t, fieldName); - final int hash = fieldNameList.indexOf(value); + final D value = getter.apply(t); + final int hash = hashValList.indexOf(value); if (hash < 0) { - fieldNameList.add(value); - return fieldNameList.size() - 1; + hashValList.add(value); + return hashValList.size() - 1; } else { return hash; } 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 fc5f4a2b4..acb7cf236 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 @@ -427,6 +427,26 @@ public class CollUtilTest { Assert.assertEquals("李四", groupByField.get(1).get(0).getName()); } + @Test + public void groupByFuncTest() { + final List list = ListUtil.of(new TestBean("张三", 12), new TestBean("李四", 13), new TestBean("王五", 12)); + final List> groupByField = CollUtil.groupByFunc(list, TestBean::getAge); + Assert.assertEquals("张三", groupByField.get(0).get(0).getName()); + Assert.assertEquals("王五", groupByField.get(0).get(1).getName()); + + Assert.assertEquals("李四", groupByField.get(1).get(0).getName()); + } + + @Test + public void groupByFunc2Test() { + final List list = ListUtil.of(new TestBean("张三", 12), new TestBean("李四", 13), new TestBean("王五", 12)); + final List> groupByField = CollUtil.groupByFunc(list, a -> a.getAge() > 12); + Assert.assertEquals("张三", groupByField.get(0).get(0).getName()); + Assert.assertEquals("王五", groupByField.get(0).get(1).getName()); + + Assert.assertEquals("李四", groupByField.get(1).get(0).getName()); + } + @Test public void sortByPropertyTest() { final List list = ListUtil.of( @@ -854,7 +874,7 @@ public class CollUtilTest { final List result = CollUtil.subtractToList(list1, list2); Assert.assertEquals(1, result.size()); - Assert.assertEquals(1L, (long)result.get(0)); + Assert.assertEquals(1L, (long) result.get(0)); } @Test