From d799e43e548da1b1affc53e879f581f5a97a087f Mon Sep 17 00:00:00 2001 From: huangchengxing <841396397@qq.com> Date: Wed, 19 Oct 2022 11:21:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=94=AF=E6=8C=81=E5=AF=B9?= =?UTF-8?q?=E5=80=BC=E9=9B=86=E5=90=88=E8=BF=9B=E8=A1=8C=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E7=9A=84=E5=88=86=E7=BB=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/hutool/core/stream/CollectorUtil.java | 61 +++++++++++++++++++ .../hutool/core/stream/CollectorUtilTest.java | 24 ++++++++ 2 files changed, 85 insertions(+) diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java b/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java index e5374e243..71bdc4ff6 100644 --- a/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/stream/CollectorUtil.java @@ -147,6 +147,67 @@ public class CollectorUtil { return groupingBy(classifier, Collectors.toList()); } + /** + * 提供对null值友好的groupingBy操作的{@link Collector}实现, + * 对集合分组,然后对分组后的值集合进行映射 + * + * @param classifier 分组依据 + * @param valueMapper 值映射方法 + * @param valueCollFactory 值集合的工厂方法 + * @param mapFactory Map集合的工厂方法 + * @param 元素类型 + * @param 键类型 + * @param 值类型 + * @param 值集合类型 + * @param 返回的Map集合类型 + * @return {@link Collector} + */ + public static , M extends Map> Collector groupingBy( + final Function classifier, + final Function valueMapper, + final Supplier valueCollFactory, + final Supplier mapFactory) { + return groupingBy(classifier, mapFactory, Collectors.mapping( + valueMapper, Collectors.toCollection(valueCollFactory) + )); + } + + /** + * 提供对null值友好的groupingBy操作的{@link Collector}实现, + * 对集合分组,然后对分组后的值集合进行映射 + * + * @param classifier 分组依据 + * @param valueMapper 值映射方法 + * @param valueCollFactory 值集合的工厂方法 + * @param 元素类型 + * @param 键类型 + * @param 值类型 + * @param 值集合类型 + * @return {@link Collector} + */ + public static > Collector> groupingBy( + final Function classifier, + final Function valueMapper, + final Supplier valueCollFactory) { + return groupingBy(classifier, valueMapper, valueCollFactory, HashMap::new); + } + + /** + * 提供对null值友好的groupingBy操作的{@link Collector}实现, + * 对集合分组,然后对分组后的值集合进行映射 + * + * @param classifier 分组依据 + * @param valueMapper 值映射方法 + * @param 元素类型 + * @param 键类型 + * @param 值类型 + * @return {@link Collector} + */ + public static Collector>> groupingBy( + final Function classifier, + final Function valueMapper) { + return groupingBy(classifier, valueMapper, ArrayList::new, HashMap::new); + } /** * 对null友好的 toMap 操作的 {@link Collector}实现,默认使用HashMap diff --git a/hutool-core/src/test/java/cn/hutool/core/stream/CollectorUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/stream/CollectorUtilTest.java index 9fb5959d9..7605a653e 100644 --- a/hutool-core/src/test/java/cn/hutool/core/stream/CollectorUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/stream/CollectorUtilTest.java @@ -78,4 +78,28 @@ public class CollectorUtilTest { .put(3, 1L) .build(), map); } + + @Test + public void testGroupingByAfterValueMapped() { + List list = Arrays.asList(1, 1, 2, 2, 3, 4); + Map> map = list.stream() + .collect(CollectorUtil.groupingBy(t -> (t & 1) == 0, String::valueOf, LinkedHashSet::new, LinkedHashMap::new)); + + Assert.assertEquals(LinkedHashMap.class, map.getClass()); + Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("2", "4")), map.get(Boolean.TRUE)); + Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("1", "3")), map.get(Boolean.FALSE)); + + map = list.stream() + .collect(CollectorUtil.groupingBy(t -> (t & 1) == 0, String::valueOf, LinkedHashSet::new)); + Assert.assertEquals(HashMap.class, map.getClass()); + Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("2", "4")), map.get(Boolean.TRUE)); + Assert.assertEquals(new LinkedHashSet<>(Arrays.asList("1", "3")), map.get(Boolean.FALSE)); + + Map> map2 = list.stream() + .collect(CollectorUtil.groupingBy(t -> (t & 1) == 0, String::valueOf)); + Assert.assertEquals(Arrays.asList("2", "2", "4"), map2.get(Boolean.TRUE)); + Assert.assertEquals(Arrays.asList("1", "1", "3"), map2.get(Boolean.FALSE)); + + } + }