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 f474c53ea..a1bf57f09 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 @@ -243,8 +243,13 @@ public class CollectorUtil { value.forEach((k, v) -> result.computeIfAbsent(k, i -> new ArrayList<>()).add(v)); return result; }, (l, r) -> { - r.forEach((k, v) -> l.computeIfAbsent(k, i -> new ArrayList<>()).addAll(v)); - return l; + R resultMap = mapSupplier.get(); + resultMap.putAll(l); + r.forEach((k, v) -> { + List list = resultMap.computeIfAbsent(k, i -> new ArrayList<>()); + list.addAll(v); + }); + return resultMap; } ); } 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 bd8a415ba..c79d7f494 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 @@ -1,5 +1,6 @@ package cn.hutool.core.stream; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.map.MapUtil; import org.junit.Assert; import org.junit.Test; @@ -29,6 +30,22 @@ public class CollectorUtilTest { Assert.assertEquals(MapUtil.builder("苏格拉底", Arrays.asList(1, 2)) .put("特拉叙马霍斯", Arrays.asList(3, 1, 2)).build(), nameScoresMap); + + List> data = ListUtil.toList( + MapUtil.builder("name", "sam").put("count", "80").map(), + MapUtil.builder("name", "sam").put("count", "81").map(), + MapUtil.builder("name", "sam").put("count", "82").map(), + MapUtil.builder("name", "jack").put("count", "80").map(), + MapUtil.builder("name", "jack").put("count", "90").map() + ); + + Map>> nameMap = data.stream() + .collect(Collectors.groupingBy(e -> e.get("name"), CollectorUtil.reduceListMap())); + Assert.assertEquals(MapUtil.builder("jack", MapUtil.builder("name", Arrays.asList("jack", "jack")) + .put("count", Arrays.asList("80", "90")).build()) + .put("sam", MapUtil.builder("name", Arrays.asList("sam", "sam", "sam")) + .put("count", Arrays.asList("80", "81", "82")).build()) + .build(), nameMap); } @Test