From 9768a4d0802f350fdf508b6e8f0d9fd10fced71f Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 21 Dec 2021 23:56:43 +0800 Subject: [PATCH] add method --- CHANGELOG.md | 1 + .../core/collection/CollStreamUtil.java | 36 ++++++++++++------- .../core/collection/CollStreamUtilTest.java | 14 ++++---- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ac6a595a..0187dde38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * 【log 】 log4j2的编译依赖改为api,core为test依赖(pr#2019@Github) * 【core 】 Img.scale缩小默认使用平滑模式,增加scale方法重载可选模式(issue#I4MY6X@Gitee) * 【core 】 excel添加写入图片的方法(pr#486@Gitee) +* 【core 】 增加CollStreamUtil.groupBy(pr#484@Gitee) * ### 🐞Bug修复 * 【core 】 LineReadWatcher#onModify文件清空判断问题(issue#2013@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java index ce2eb5d27..51a9c3eee 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollStreamUtil.java @@ -5,7 +5,14 @@ import cn.hutool.core.lang.Opt; import cn.hutool.core.map.MapUtil; import cn.hutool.core.stream.StreamUtil; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collector; @@ -106,7 +113,7 @@ public class CollStreamUtil { * {@code Collection -------> Map> } * * @param collection 需要分组的集合 - * @param key 分组的规则 + * @param key 键分组的规则 * @param isParallel 是否并行流 * @param collection中的泛型 * @param map中的key类型 @@ -116,7 +123,7 @@ public class CollStreamUtil { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } - return groupThen(collection, key, Collectors.toList(), isParallel); + return groupBy(collection, key, Collectors.toList(), isParallel); } /** @@ -154,7 +161,7 @@ public class CollStreamUtil { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } - return groupThen(collection, key1, Collectors.groupingBy(key2, Collectors.toList()), isParallel); + return groupBy(collection, key1, Collectors.groupingBy(key2, Collectors.toList()), isParallel); } /** @@ -191,7 +198,7 @@ public class CollStreamUtil { if (CollUtil.isEmpty(collection) || key1 == null || key2 == null) { return Collections.emptyMap(); } - return groupThen(collection, key1, Collectors.toMap(key2, Function.identity(), (l, r) -> l), isParallel); + return groupBy(collection, key1, Collectors.toMap(key2, Function.identity(), (l, r) -> l), isParallel); } /** @@ -199,8 +206,8 @@ public class CollStreamUtil { * {@code Collection -------> Map> } * * @param collection 需要分组的集合 - * @param key 分组的规则 - * @param value 分组的规则 + * @param key 键分组的规则 + * @param value 值分组的规则 * @param collection中的泛型 * @param map中的key类型 * @param List中的value类型 @@ -216,8 +223,8 @@ public class CollStreamUtil { * {@code Collection -------> Map> } * * @param collection 需要分组的集合 - * @param key 分组的规则 - * @param value 分组的规则 + * @param key 键分组的规则 + * @param value 值分组的规则 * @param isParallel 是否并行流 * @param collection中的泛型 * @param map中的key类型 @@ -229,7 +236,7 @@ public class CollStreamUtil { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } - return groupThen(collection, key, Collectors.mapping(value, Collectors.toList()), isParallel); + return groupBy(collection, key, Collectors.mapping(value, Collectors.toList()), isParallel); } /** @@ -242,12 +249,13 @@ public class CollStreamUtil { * @param map中的key类型 * @param 后续操作的返回值 * @return 分组后的map + * @since 5.7.18 */ - public static Map groupThen(Collection collection, Function key, Collector downstream) { + public static Map groupBy(Collection collection, Function key, Collector downstream) { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } - return groupThen(collection, key, downstream, false); + return groupBy(collection, key, downstream, false); } /** @@ -261,8 +269,10 @@ public class CollStreamUtil { * @param map中的key类型 * @param 后续操作的返回值 * @return 分组后的map + * @see Collectors#groupingBy(Function, Collector) + * @since 5.7.18 */ - public static Map groupThen(Collection collection, Function key, Collector downstream, boolean isParallel) { + public static Map groupBy(Collection collection, Function key, Collector downstream, boolean isParallel) { if (CollUtil.isEmpty(collection)) { return Collections.emptyMap(); } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java index feaa8b393..63d5faa56 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/CollStreamUtilTest.java @@ -8,7 +8,6 @@ import org.junit.Assert; import org.junit.Test; import java.util.*; -import java.util.function.Function; import java.util.stream.Collector; import java.util.stream.Collectors; @@ -173,16 +172,16 @@ public class CollStreamUtilTest { } @Test - public void testGroupThen() { - // groupThen作为之前所有group函数的公共部分抽取出来,并更接近于jdk原生,灵活性更强 + public void testGroupBy() { + // groupBy作为之前所有group函数的公共部分抽取出来,并更接近于jdk原生,灵活性更强 // 参数null测试 - Map> map = CollStreamUtil.groupThen(null, Student::getTermId, Collectors.toList()); + Map> map = CollStreamUtil.groupBy(null, Student::getTermId, Collectors.toList()); Assert.assertEquals(map, Collections.EMPTY_MAP); // 参数空数组测试 List list = new ArrayList<>(); - map = CollStreamUtil.groupThen(list, Student::getTermId, Collectors.toList()); + map = CollStreamUtil.groupBy(list, Student::getTermId, Collectors.toList()); Assert.assertEquals(map, Collections.EMPTY_MAP); // 放入元素 @@ -190,11 +189,12 @@ public class CollStreamUtilTest { list.add(new Student(1, 2, 1, "李四")); list.add(new Student(2, 2, 1, "王五")); // 先根据termId分组,再通过classId比较,找出最大值所属的那个Student,返回的Optional - Map> longOptionalMap = CollStreamUtil.groupThen(list, Student::getTermId, Collectors.maxBy(Comparator.comparing(Student::getClassId))); + Map> longOptionalMap = CollStreamUtil.groupBy(list, Student::getTermId, Collectors.maxBy(Comparator.comparing(Student::getClassId))); + //noinspection OptionalGetWithoutIsPresent Assert.assertEquals("李四", longOptionalMap.get(1L).get().getName()); // 先根据termId分组,再转换为Map - Map> groupThen = CollStreamUtil.groupThen(list, Student::getTermId, Collector.of(HashMap::new, (m, v) -> m.put(v.getStudentId(), v.getName()), (l, r) -> l)); + Map> groupThen = CollStreamUtil.groupBy(list, Student::getTermId, Collector.of(HashMap::new, (m, v) -> m.put(v.getStudentId(), v.getName()), (l, r) -> l)); Assert.assertEquals( MapUtil.builder() .put(1L, MapUtil.builder().put(1L, "李四").build())