diff --git a/hutool-core/src/main/java/cn/hutool/core/stream/FastStream.java b/hutool-core/src/main/java/cn/hutool/core/stream/FastStream.java new file mode 100644 index 000000000..04df601b9 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/stream/FastStream.java @@ -0,0 +1,1380 @@ +package cn.hutool.core.stream; + + +import cn.hutool.core.lang.Console; +import cn.hutool.core.lang.Opt; + +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.*; +import java.util.stream.*; + +/** + * 对Stream的封装和拓展,作者经对比了vavr、eclipse-collection、stream-ex以及其他语言的api,结合日常使用习惯,进行封装和拓展 + * Stream为集合提供了一些易用api,它让开发人员能使用声明式编程的方式去编写代码 + * 它分为中间操作和结束操作 + * 中间操作分为 + *
+ * 它分为串行流和并行流
+ * 并行流会使用拆分器{@link Spliterator}将操作拆分为多个异步任务{@link java.util.concurrent.ForkJoinTask}执行
+ * 这些异步任务默认使用{@link java.util.concurrent.ForkJoinPool}线程池进行管理
+ *
+ * @author VampireAchao
+ * @see java.util.stream.Stream
+ */
+public class FastStream
+ * 例如
+ * {@code FastStream.iterate(0, i -> i + 1)}
+ * 就可以创建从0开始,每次+1的无限流,使用{@link FastStream#limit(long)}可以限制元素个数
+ *
+ * 例如
+ * {@code FastStream.iterate(0, i -> i < 3, i -> ++i)}
+ * 就可以创建包含元素0,1,2的流,使用{@link FastStream#limit(long)}可以限制元素个数
+ *
+ * 或者写成:
+ *
+ * {@code
+ * FastStream
+ *
+ * @param mapper 操作,返回流
+ * @param {@code
+ * FastStream
+ *
+ * @param mapper 操作,返回可迭代对象
+ * @param {@code
+ * .of("one", "two", "three", "four")
+ * .filter(e -> e.length() > 3)
+ * .peek(e -> System.out.println("Filtered value: " + e))
+ * .map(String::toUpperCase)
+ * .peek(e -> System.out.println("Mapped value: " + e))
+ * .collect(Collectors.toList());
+ * }
+ */
+ @Override
+ public FastStream{@code
+ * String[] strings = Stream.
+ */
+ public A[] toArray(IntFunction generator) {
+ return stream.toArray(generator);
+ }
+
+ /**
+ * 对元素进行聚合,并返回聚合后的值,相当于在for循环里写sum=sum+ints[i]
+ * 这是一个终端操作
+ *
+ * @param identity 初始值,还用于限定泛型
+ * @param accumulator 你想要的聚合操作
+ * @return 聚合计算后的值
+ * @apiNote 求和、最小值、最大值、平均值和转换成一个String字符串均为聚合操作
+ * 例如这里对int进行求和可以写成:
+ *
+ * {@code
+ * Integer sum = integers.reduce(0, (a, b) -> a+b);
+ * }
+ * {@code
+ * Integer sum = integers.reduce(0, Integer::sum);
+ * }
+ */
+ @Override
+ public T reduce(T identity, BinaryOperator{@code
+ * boolean foundAny = false;
+ * T result = null;
+ * for (T element : this stream) {
+ * if (!foundAny) {
+ * foundAny = true;
+ * result = element;
+ * }
+ * else
+ * result = accumulator.apply(result, element);
+ * }
+ * return foundAny ? Optional.of(result) : Optional.empty();
+ * }
+ * 但它不局限于顺序执行,例如并行流等情况下
+ * 这是一个终端操作
+ *
+ * @param accumulator 你想要的聚合操作
+ * @return 聚合后用 {@link Optional}包裹的值
+ * @throws NullPointerException 如果给定的聚合操作中执行后结果为空,并用于下一次执行,则抛出该异常
+ * @apiNote 例如以下场景抛出 NPE :
+ * {@code
+ * Optional
+ * @see #reduce(Object, BinaryOperator)
+ * @see #min(Comparator)
+ * @see #max(Comparator)
+ */
+ @Override
+ public Optional{@code
+ * List
+ */
+ @Override
+ public > subList(int batchSize) {
+ return sub(batchSize).map(FastStream::toList);
+ }
+
+ public interface FastStreamBuilder
{@code
+ * accept(t)
+ * return this;
+ * }
+ */
+ default FastStreamBuilder> lists = FastStream.of(list).sub(2).map(FastStream::toList).toList();
+ Assert.assertEquals(Arrays.asList(Arrays.asList(1, 2),
+ Arrays.asList(3, 4),
+ singletonList(5)
+ ), lists);
+ }
+
+ @Test
+ void testSubList() {
+ List
> lists = FastStream.of(list).subList(2).toList();
+ Assert.assertEquals(Arrays.asList(Arrays.asList(1, 2),
+ Arrays.asList(3, 4),
+ singletonList(5)
+ ), lists);
+ }
+}