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 5e1fcefb3..b11d08d2f 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 @@ -24,7 +24,7 @@ public class CollectorUtil { * 说明已包含IDENTITY_FINISH特征 为 Characteristics.IDENTITY_FINISH 的缩写 */ public static final Set CH_ID - = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)); + = Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH)); /** * 说明不包含IDENTITY_FINISH特征 */ @@ -50,7 +50,7 @@ public class CollectorUtil { * @return {@link Collector} */ public static Collector joining(final CharSequence delimiter, - final Function toStringFunc) { + final Function toStringFunc) { return joining(delimiter, StrUtil.EMPTY, StrUtil.EMPTY, toStringFunc); } @@ -65,15 +65,15 @@ public class CollectorUtil { * @return {@link Collector} */ public static Collector joining(final CharSequence delimiter, - final CharSequence prefix, - final CharSequence suffix, - final Function toStringFunc) { + final CharSequence prefix, + final CharSequence suffix, + final Function toStringFunc) { return new SimpleCollector<>( - () -> new StringJoiner(delimiter, prefix, suffix), - (joiner, ele) -> joiner.add(toStringFunc.apply(ele)), - StringJoiner::merge, - StringJoiner::toString, - Collections.emptySet() + () -> new StringJoiner(delimiter, prefix, suffix), + (joiner, ele) -> joiner.add(toStringFunc.apply(ele)), + StringJoiner::merge, + StringJoiner::toString, + Collections.emptySet() ); } @@ -92,8 +92,8 @@ public class CollectorUtil { * @return {@link Collector} */ public static > Collector groupingBy(final Function classifier, - final Supplier mapFactory, - final Collector downstream) { + final Supplier mapFactory, + final Collector downstream) { final Supplier downstreamSupplier = downstream.supplier(); final BiConsumer downstreamAccumulator = downstream.accumulator(); final BiConsumer, T> accumulator = (m, t) -> { @@ -131,9 +131,8 @@ public class CollectorUtil { * @param 下游操作在进行中间操作时对应类型 * @return {@link Collector} */ - public static - Collector> groupingBy(final Function classifier, - final Collector downstream) { + public static Collector> groupingBy(final Function classifier, + final Collector downstream) { return groupingBy(classifier, HashMap::new, downstream); } @@ -145,8 +144,7 @@ public class CollectorUtil { * @param 实体中的分组依据对应类型,也是Map中key的类型 * @return {@link Collector} */ - public static Collector>> - groupingBy(final Function classifier) { + public static Collector>> groupingBy(final Function classifier) { return groupingBy(classifier, Collectors.toList()); } @@ -161,10 +159,9 @@ public class CollectorUtil { * @param map中value的类型 * @return 对null友好的 toMap 操作的 {@link Collector}实现 */ - public static - Collector> toMap(final Function keyMapper, - final Function valueMapper, - final BinaryOperator mergeFunction) { + public static Collector> toMap(final Function keyMapper, + final Function valueMapper, + final BinaryOperator mergeFunction) { return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new); } @@ -183,11 +180,11 @@ public class CollectorUtil { */ public static > Collector toMap(final Function keyMapper, - final Function valueMapper, - final BinaryOperator mergeFunction, - final Supplier mapSupplier) { + final Function valueMapper, + final BinaryOperator mergeFunction, + final Supplier mapSupplier) { final BiConsumer accumulator - = (map, element) -> map.put(Opt.ofNullable(element).map(keyMapper).get(), Opt.ofNullable(element).map(valueMapper).get()); + = (map, element) -> map.put(Opt.ofNullable(element).map(keyMapper).get(), Opt.ofNullable(element).map(valueMapper).get()); return new SimpleCollector<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); } @@ -233,13 +230,13 @@ public class CollectorUtil { */ public static >> Collector, ?, R> reduceListMap(final Supplier mapSupplier) { return Collectors.reducing(mapSupplier.get(), value -> { - R result = mapSupplier.get(); - 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; - } + final R result = mapSupplier.get(); + 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; + } ); } @@ -254,7 +251,7 @@ public class CollectorUtil { * @return 收集器 */ public static Collector, EntryStream> toEntryStream( - Function keyMapper, Function valueMapper) { + final Function keyMapper, final Function valueMapper) { Objects.requireNonNull(keyMapper); Objects.requireNonNull(valueMapper); return transform(ArrayList::new, list -> EntryStream.of(list, keyMapper, valueMapper)); @@ -287,11 +284,14 @@ public class CollectorUtil { * @return 收集器 */ public static > Collector transform( - Supplier collFactory, Function mapper) { + final Supplier collFactory, final Function mapper) { Objects.requireNonNull(collFactory); Objects.requireNonNull(mapper); return new SimpleCollector<>( - collFactory, C::add, (l1, l2) -> { l1.addAll(l2); return l1; }, mapper, CH_NOID + collFactory, C::add, (l1, l2) -> { + l1.addAll(l2); + return l1; + }, mapper, CH_NOID ); } @@ -309,7 +309,7 @@ public class CollectorUtil { * @param 输入元素类型 * @return 收集器 */ - public static Collector, R> transform(Function, R> mapper) { + public static Collector, R> transform(final Function, R> mapper) { return transform(ArrayList::new, mapper); } diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/EasyStream.java b/hutool-core/src/main/java/cn/hutool/core/stream/EasyStream.java index 5de688e5c..8e2319b2d 100644 --- a/hutool-core/src/main/java/cn/hutool/core/stream/EasyStream.java +++ b/hutool-core/src/main/java/cn/hutool/core/stream/EasyStream.java @@ -462,6 +462,7 @@ public class EasyStream extends StreamWrapper> implements St /** * 返回与指定函数将元素作为参数执行后组成的流。操作带下标,并行流时下标永远为-1 * 这是一个无状态中间操作 + * * @param action 指定的函数 * @return 返回叠加操作后的FastStream * @apiNote 该方法存在的意义主要是用来调试 @@ -475,12 +476,12 @@ public class EasyStream extends StreamWrapper> implements St * .collect(Collectors.toList()); * } */ - public EasyStream peekIdx(BiConsumer action) { + public EasyStream peekIdx(final BiConsumer action) { Objects.requireNonNull(action); if (isParallel()) { return peek(e -> action.accept(e, NOT_FOUND_INDEX)); } else { - AtomicInteger index = new AtomicInteger(NOT_FOUND_INDEX); + final AtomicInteger index = new AtomicInteger(NOT_FOUND_INDEX); return peek(e -> action.accept(e, index.incrementAndGet())); } } @@ -688,7 +689,7 @@ public class EasyStream extends StreamWrapper> implements St * @return 实现类 */ @Override - protected EasyStream convertToStreamImpl(Stream stream) { + protected EasyStream convertToStreamImpl(final Stream stream) { return new EasyStream<>(stream); } @@ -852,10 +853,10 @@ public class EasyStream extends StreamWrapper> implements St * eg: * {@code List studentTree = EasyStream.of(students).toTree(Student::getId, Student::getParentId, Student::setChildren) } */ - public > List toTree(Function idGetter, - Function pIdGetter, - BiConsumer> childrenSetter) { - Map> pIdValuesMap = group(pIdGetter); + public > List toTree(final Function idGetter, + final Function pIdGetter, + final BiConsumer> childrenSetter) { + final Map> pIdValuesMap = group(pIdGetter); return getChildrenFromMapByPidAndSet(idGetter, childrenSetter, pIdValuesMap, pIdValuesMap.get(null)); } @@ -873,12 +874,12 @@ public class EasyStream extends StreamWrapper> implements St * {@code List studentTree = EasyStream.of(students).toTree(Student::getId, Student::getParentId, Student::setChildren, Student::getMatchParent) } */ - public > List toTree(Function idGetter, - Function pIdGetter, - BiConsumer> childrenSetter, - Predicate parentPredicate) { - List list = toList(); - List parents = EasyStream.of(list).filter(e -> + public > List toTree(final Function idGetter, + final Function pIdGetter, + final BiConsumer> childrenSetter, + final Predicate parentPredicate) { + final List list = toList(); + final List parents = EasyStream.of(list).filter(e -> // 此处是为了适配 parentPredicate.test空指针 情况 // 因为Predicate.test的返回值是boolean,所以如果 e -> null 这种返回null的情况,会直接抛出NPE Opt.ofTry(() -> parentPredicate.test(e)).filter(Boolean::booleanValue).isPresent()) @@ -897,13 +898,13 @@ public class EasyStream extends StreamWrapper> implements St * @param 此处是id的泛型限制 * @return list 组装好的树 */ - private > List getChildrenFromMapByPidAndSet(Function idGetter, - BiConsumer> childrenSetter, - Map> pIdValuesMap, - List parents) { - MutableObj>> recursiveRef = new MutableObj<>(); - Consumer> recursive = values -> EasyStream.of(values, isParallel()).forEach(value -> { - List children = pIdValuesMap.get(idGetter.apply(value)); + private > List getChildrenFromMapByPidAndSet(final Function idGetter, + final BiConsumer> childrenSetter, + final Map> pIdValuesMap, + final List parents) { + final MutableObj>> recursiveRef = new MutableObj<>(); + final Consumer> recursive = values -> EasyStream.of(values, isParallel()).forEach(value -> { + final List children = pIdValuesMap.get(idGetter.apply(value)); childrenSetter.accept(value, children); recursiveRef.get().accept(children); }); @@ -922,9 +923,9 @@ public class EasyStream extends StreamWrapper> implements St * eg: * {@code List students = EasyStream.of(studentTree).flatTree(Student::getChildren, Student::setChildren).toList() } */ - public EasyStream flatTree(Function> childrenGetter, BiConsumer> childrenSetter) { - MutableObj>> recursiveRef = new MutableObj<>(); - Function> recursive = e -> EasyStream.of(childrenGetter.apply(e)).flat(recursiveRef.get()).unshift(e); + public EasyStream flatTree(final Function> childrenGetter, final BiConsumer> childrenSetter) { + final MutableObj>> recursiveRef = new MutableObj<>(); + final Function> recursive = e -> EasyStream.of(childrenGetter.apply(e)).flat(recursiveRef.get()).unshift(e); recursiveRef.set(recursive); return flat(recursive).peek(e -> childrenSetter.accept(e, null)); } diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/StreamWrapper.java b/hutool-core/src/main/java/cn/hutool/core/stream/StreamWrapper.java index 60da8e88d..558dd7d42 100644 --- a/hutool-core/src/main/java/cn/hutool/core/stream/StreamWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/stream/StreamWrapper.java @@ -22,7 +22,7 @@ abstract class StreamWrapper> implements Stream, Itera * * @param stream 包装的流对象 */ - protected StreamWrapper(Stream stream) { + protected StreamWrapper(final Stream stream) { Objects.requireNonNull(stream, "stream must not null"); this.stream = stream; } @@ -35,7 +35,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 返回叠加过滤操作后的流 */ @Override - public I filter(Predicate predicate) { + public I filter(final Predicate predicate) { return convertToStreamImpl(stream.filter(predicate)); } @@ -47,7 +47,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 叠加操作后元素类型全为int的流 */ @Override - public IntStream mapToInt(ToIntFunction mapper) { + public IntStream mapToInt(final ToIntFunction mapper) { return stream.mapToInt(mapper); } @@ -59,7 +59,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 叠加操作后元素类型全为long的流 */ @Override - public LongStream mapToLong(ToLongFunction mapper) { + public LongStream mapToLong(final ToLongFunction mapper) { return stream.mapToLong(mapper); } @@ -71,7 +71,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 叠加操作后元素类型全为double的流 */ @Override - public DoubleStream mapToDouble(ToDoubleFunction mapper) { + public DoubleStream mapToDouble(final ToDoubleFunction mapper) { return stream.mapToDouble(mapper); } @@ -83,7 +83,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 返回叠加拆分操作后的IntStream */ @Override - public IntStream flatMapToInt(Function mapper) { + public IntStream flatMapToInt(final Function mapper) { return stream.flatMapToInt(mapper); } @@ -95,7 +95,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 返回叠加拆分操作后的LongStream */ @Override - public LongStream flatMapToLong(Function mapper) { + public LongStream flatMapToLong(final Function mapper) { return stream.flatMapToLong(mapper); } @@ -107,7 +107,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 返回叠加拆分操作后的DoubleStream */ @Override - public DoubleStream flatMapToDouble(Function mapper) { + public DoubleStream flatMapToDouble(final Function mapper) { return stream.flatMapToDouble(mapper); } @@ -145,7 +145,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 一个元素按指定的Comparator排序的流 */ @Override - public I sorted(Comparator comparator) { + public I sorted(final Comparator comparator) { return convertToStreamImpl(stream.sorted(comparator)); } @@ -167,7 +167,7 @@ abstract class StreamWrapper> implements Stream, Itera * } */ @Override - public I peek(Consumer action) { + public I peek(final Consumer action) { return convertToStreamImpl(stream.peek(action)); } @@ -179,7 +179,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 截取后的流 */ @Override - public I limit(long maxSize) { + public I limit(final long maxSize) { return convertToStreamImpl(stream.limit(maxSize)); } @@ -191,7 +191,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 丢弃前面n个元素后的剩余元素组成的流 */ @Override - public I skip(long n) { + public I skip(final long n) { return convertToStreamImpl(stream.skip(n)); } @@ -202,7 +202,7 @@ abstract class StreamWrapper> implements Stream, Itera * @param action 操作 */ @Override - public void forEach(Consumer action) { + public void forEach(final Consumer action) { stream.forEach(action); } @@ -213,7 +213,7 @@ abstract class StreamWrapper> implements Stream, Itera * @param action 操作 */ @Override - public void forEachOrdered(Consumer action) { + public void forEachOrdered(final Consumer action) { stream.forEachOrdered(action); } @@ -238,7 +238,8 @@ abstract class StreamWrapper> implements Stream, Itera * @throws ArrayStoreException 如果元素转换失败,例如不是该元素类型及其父类,则抛出该异常 */ @Override - public A[] toArray(IntFunction generator) { + public A[] toArray(final IntFunction generator) { + //noinspection SuspiciousToArrayCall return stream.toArray(generator); } @@ -263,7 +264,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 聚合计算后的值 */ @Override - public T reduce(T identity, BinaryOperator accumulator) { + public T reduce(final T identity, final BinaryOperator accumulator) { return stream.reduce(identity, accumulator); } @@ -298,7 +299,7 @@ abstract class StreamWrapper> implements Stream, Itera * @see #max(Comparator) */ @Override - public Optional reduce(BinaryOperator accumulator) { + public Optional reduce(final BinaryOperator accumulator) { return stream.reduce(accumulator); } @@ -315,7 +316,7 @@ abstract class StreamWrapper> implements Stream, Itera * @see #reduce(Object, BinaryOperator) */ @Override - public U reduce(U identity, BiFunction accumulator, BinaryOperator combiner) { + public U reduce(final U identity, final BiFunction accumulator, final BinaryOperator combiner) { return stream.reduce(identity, accumulator, combiner); } @@ -333,7 +334,7 @@ abstract class StreamWrapper> implements Stream, Itera * } */ @Override - public R collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner) { + public R collect(final Supplier supplier, final BiConsumer accumulator, final BiConsumer combiner) { return stream.collect(supplier, accumulator, combiner); } @@ -347,7 +348,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 收集后的容器 */ @Override - public R collect(Collector collector) { + public R collect(final Collector collector) { return stream.collect(collector); } @@ -358,7 +359,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 最小值 */ @Override - public Optional min(Comparator comparator) { + public Optional min(final Comparator comparator) { return stream.min(comparator); } @@ -369,7 +370,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 最大值 */ @Override - public Optional max(Comparator comparator) { + public Optional max(final Comparator comparator) { return stream.max(comparator); } @@ -390,7 +391,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 是否有任何一个元素满足给定断言 */ @Override - public boolean anyMatch(Predicate predicate) { + public boolean anyMatch(final Predicate predicate) { return stream.anyMatch(predicate); } @@ -401,7 +402,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 是否所有元素满足给定断言 */ @Override - public boolean allMatch(Predicate predicate) { + public boolean allMatch(final Predicate predicate) { return stream.allMatch(predicate); } @@ -412,7 +413,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 是否没有元素满足给定断言 */ @Override - public boolean noneMatch(Predicate predicate) { + public boolean noneMatch(final Predicate predicate) { return stream.noneMatch(predicate); } @@ -504,7 +505,7 @@ abstract class StreamWrapper> implements Stream, Itera * @return 流 */ @Override - public I onClose(Runnable closeHandler) { + public I onClose(final Runnable closeHandler) { return convertToStreamImpl(stream.onClose(closeHandler)); } 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 00670f8d2..a56eefd30 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 @@ -47,14 +47,14 @@ public class CollectorUtilTest { @Test public void testToEasyStream() { - Stream stream =Stream.of(1, 2, 3, 4) + final Stream stream =Stream.of(1, 2, 3, 4) .collect(CollectorUtil.toEasyStream()); Assert.assertEquals(EasyStream.class, stream.getClass()); } @Test public void testToEntryStream() { - Map map = Stream.of(1, 2, 3, 4, 5) + final Map map = Stream.of(1, 2, 3, 4, 5) // 转为EntryStream .collect(CollectorUtil.toEntryStream(Function.identity(), String::valueOf)) // 过滤偶数 diff --git a/hutool-core/src/test/java/cn/hutool/core/stream/EasyStreamTest.java b/hutool-core/src/test/java/cn/hutool/core/stream/EasyStreamTest.java index 6312d17e3..3e38345c1 100644 --- a/hutool-core/src/test/java/cn/hutool/core/stream/EasyStreamTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/stream/EasyStreamTest.java @@ -209,7 +209,7 @@ public class EasyStreamTest { } @Test - public void testPeek(){ + public void testPeek() { EasyStream.of("one", "two", "three", "four") .filter(e -> e.length() == 4) .peek(e -> Assert.assertEquals("four", e)) @@ -219,12 +219,12 @@ public class EasyStreamTest { } @Test - public void testPeekIdx(){ + public void testPeekIdx() { EasyStream.of("one", "two", "three", "four") .filter(e -> e.length() == 4) - .peekIdx((e,i) -> Assert.assertEquals("four:0", e + ":" + i)) + .peekIdx((e, i) -> Assert.assertEquals("four:0", e + ":" + i)) .map(String::toUpperCase) - .peekIdx((e,i) -> Assert.assertEquals("FOUR:0", e + ":" + i)) + .peekIdx((e, i) -> Assert.assertEquals("FOUR:0", e + ":" + i)) .collect(Collectors.toList()); } @@ -455,7 +455,7 @@ public class EasyStreamTest { @Test public void testToTree() { Consumer test = o -> { - List studentTree = EasyStream + final List studentTree = EasyStream .of( Student.builder().id(1L).name("dromara").build(), Student.builder().id(2L).name("baomidou").build(), @@ -488,7 +488,7 @@ public class EasyStreamTest { ), studentTree); }; test = test.andThen(o -> { - List studentTree = EasyStream + final List studentTree = EasyStream .of( Student.builder().id(1L).name("dromara").matchParent(true).build(), Student.builder().id(2L).name("baomidou").matchParent(true).build(), @@ -525,7 +525,7 @@ public class EasyStreamTest { @Test public void testFlatTree() { - List studentTree = asList( + final List studentTree = asList( Student.builder().id(1L).name("dromara") .children(asList(Student.builder().id(3L).name("hutool").parentId(1L) .children(singletonList(Student.builder().id(6L).name("looly").parentId(3L).build())) @@ -575,9 +575,9 @@ public class EasyStreamTest { @Test public void testTransform() { final boolean result = EasyStream.of(1, 2, 3) - .transform(EasyStream::toList) - .map(List::isEmpty) - .orElse(false); + .transform(EasyStream::toList) + .map(List::isEmpty) + .orElse(false); Assert.assertFalse(result); }