From 0f3c6587467cc6118730ad30ca0cc5c0bd3702d5 Mon Sep 17 00:00:00 2001 From: TanShengyuan <2635891552@qq.com> Date: Sat, 24 Sep 2022 17:07:56 +0800 Subject: [PATCH] :trollface: --- .../cn/hutool/core/stream/CollectorUtil.java | 21 ++++++++ .../hutool/core/stream/CollectorUtilTest.java | 52 ++++++++++++------- 2 files changed, 53 insertions(+), 20 deletions(-) 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 ecbfab5a7..29ca9f989 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 @@ -495,4 +495,25 @@ public class CollectorUtil { }; } + + /** + *

过滤

+ * + * @param predicate 断言 + * @param downstream 下游操作 + * @param 元素类型 + * @param 中间类型 + * @param 结束类型 + * @return 一个用于过滤元素的 {@link java.util.stream.Collector} + * @author TanShengYuan + */ + public static + Collector filtering(final Predicate predicate, + final Collector downstream) { + final BiConsumer downstreamAccumulator = downstream.accumulator(); + return new SimpleCollector<>(downstream.supplier(), + (r, t) -> Opt.of(t).filter(predicate).ifPresent(e -> downstreamAccumulator.accept(r, e)), + downstream.combiner(), downstream.finisher(), + downstream.characteristics()); + } } 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 a56eefd30..9fb5959d9 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 @@ -20,50 +20,62 @@ public class CollectorUtilTest { @Test public void reduceListMapTest() { final Set> nameScoreMapList = StreamUtil.of( - // 集合内的第一个map,包含两个key value - MapUtil.builder("苏格拉底", 1).put("特拉叙马霍斯", 3).build(), - MapUtil.of("苏格拉底", 2), - MapUtil.of("特拉叙马霍斯", 1), - MapUtil.of("特拉叙马霍斯", 2) + // 集合内的第一个map,包含两个key value + MapUtil.builder("苏格拉底", 1).put("特拉叙马霍斯", 3).build(), + MapUtil.of("苏格拉底", 2), + MapUtil.of("特拉叙马霍斯", 1), + MapUtil.of("特拉叙马霍斯", 2) ).collect(Collectors.toSet()); // 执行聚合 final Map> nameScoresMap = nameScoreMapList.stream().collect(CollectorUtil.reduceListMap()); Assert.assertEquals(MapUtil.builder("苏格拉底", Arrays.asList(1, 2)) - .put("特拉叙马霍斯", Arrays.asList(3, 1, 2)).build(), - nameScoresMap); + .put("特拉叙马霍斯", Arrays.asList(3, 1, 2)).build(), + nameScoresMap); } @Test public void testTransform() { Stream stream = Stream.of(1, 2, 3, 4) - .collect(CollectorUtil.transform(EasyStream::of)); + .collect(CollectorUtil.transform(EasyStream::of)); Assert.assertEquals(EasyStream.class, stream.getClass()); stream = Stream.of(1, 2, 3, 4) - .collect(CollectorUtil.transform(HashSet::new, EasyStream::of)); + .collect(CollectorUtil.transform(HashSet::new, EasyStream::of)); Assert.assertEquals(EasyStream.class, stream.getClass()); } @Test public void testToEasyStream() { - final Stream stream =Stream.of(1, 2, 3, 4) - .collect(CollectorUtil.toEasyStream()); + final Stream stream = Stream.of(1, 2, 3, 4) + .collect(CollectorUtil.toEasyStream()); Assert.assertEquals(EasyStream.class, stream.getClass()); } @Test public void testToEntryStream() { final Map map = Stream.of(1, 2, 3, 4, 5) - // 转为EntryStream - .collect(CollectorUtil.toEntryStream(Function.identity(), String::valueOf)) - // 过滤偶数 - .filterByKey(k -> (k & 1) == 1) - .inverse() - .toMap(); - Assert.assertEquals((Integer)1, map.get("1")); - Assert.assertEquals((Integer)3, map.get("3")); - Assert.assertEquals((Integer)5, map.get("5")); + // 转为EntryStream + .collect(CollectorUtil.toEntryStream(Function.identity(), String::valueOf)) + // 过滤偶数 + .filterByKey(k -> (k & 1) == 1) + .inverse() + .toMap(); + Assert.assertEquals((Integer) 1, map.get("1")); + Assert.assertEquals((Integer) 3, map.get("3")); + Assert.assertEquals((Integer) 5, map.get("5")); } + @Test + public void testFiltering() { + final Map map = Stream.of(1, 2, 3) + .collect(Collectors.groupingBy(Function.identity(), + CollectorUtil.filtering(i -> i > 1, Collectors.counting()) + )); + Assert.assertEquals(MapUtil.builder() + .put(1, 0L) + .put(2, 1L) + .put(3, 1L) + .build(), map); + } }