Class EasyStream<T>
java.lang.Object
org.miaixz.bus.core.center.stream.EnhancedWrappedStream<T,EasyStream<T>>
org.miaixz.bus.core.center.stream.EasyStream<T>
- Type Parameters:
T- 对象类型
- All Implemented Interfaces:
AutoCloseable,Iterable<T>,BaseStream<T,,Stream<T>> Stream<T>,TerminableWrappedStream<T,,EasyStream<T>> TransformableWrappedStream<T,,EasyStream<T>> WrappedStream<T,EasyStream<T>>
单元素的扩展流实现。基于原生Stream进行了封装和增强。 作者经对比了vavr、eclipse-collection、stream-ex以及其他语言的api,结合日常使用习惯,进行封装和拓展
Stream为集合提供了一些易用api,它让开发人员能使用声明式编程的方式去编写代码。
中间操作和结束操作
针对流的操作分为分为中间操作和结束操作, 流只有在结束操作时才会真正触发执行以往的中间操作。 中间操作:
- 无状态中间操作: 表示不用等待 所有元素的当前操作执行完 就可以执行的操作,不依赖之前历史操作的流的状态;
- 有状态中间操作: 表示需要等待 所有元素的当前操作执行完 才能执行的操作,依赖之前历史操作的流的状态;
- 短路结束操作: 表示不用等待 所有元素的当前操作执行完 就可以执行的操作;
- 非短路结束操作: 表示需要等待 所有元素的当前操作执行完 才能执行的操作;
串行流与并行流
流分为串行流和并行流两类:- 串行流:针对流的所有操作都会通过当前线程完成;
- 并行流:针对流的操作会通过拆分器
Spliterator拆分为多个异步任务ForkJoinTask执行, 这些异步任务默认使用ForkJoinPool线程池进行管理;
WrappedStream.sequential()或WrappedStream.parallel()互相转换。- Since:
- Java 17+
- Author:
- Kimi Liu
- See Also:
-
Nested Class Summary
Nested Classes -
Field Summary
Fields inherited from class org.miaixz.bus.core.center.stream.EnhancedWrappedStream
streamFields inherited from interface org.miaixz.bus.core.center.stream.WrappedStream
NOT_FOUND_ELEMENT_INDEX -
Method Summary
Modifier and TypeMethodDescriptionavg(Function<? super T, BigDecimal> mapper) 计算BigDecimal类型的平均值 并以四舍五入的方式保留2位精度avg(Function<? super T, BigDecimal> mapper, int scale) BigDecimal类型的平均值 并以四舍五入的方式保留小数点后scale位avg(Function<? super T, BigDecimal> mapper, int scale, RoundingMode roundingMode) 计算BigDecimal类型的平均值avg(ToDoubleFunction<? super T> mapper) 计算double类型的平均值avg(ToIntFunction<? super T> mapper) 计算int类型的平均值avg(ToLongFunction<? super T> mapper) 计算double平均值static <T> EasyStream.Builder<T> builder()返回FastStream的建造器static <T> EasyStream<T> 创建一个惰性拼接流,其元素是第一个流的所有元素,然后是第二个流的所有元素。 如果两个输入流都是有序的,则结果流是有序的,如果任一输入流是并行的,则结果流是并行的。 当结果流关闭时,两个输入流的关闭处理程序都会被调用。static <T> EasyStream<T> empty()返回空的串行流static <T> EasyStream<T> 返回无限串行无序流 其中每一个元素都由给定的Supplier生成 适用场景在一些生成常量流、随机元素等static <T> EasyStream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next) 返回无限有序流 该流由 初始值 然后判断条件 以及执行 迭代函数 进行迭代获取到元素static <T> EasyStream<T> iterate(T seed, UnaryOperator<T> f) 返回无限有序流 该流由 初始值 以及执行 迭代函数 进行迭代获取到元素static <T> EasyStream<T> iterateHierarchies(T root, Function<T, Collection<T>> discoverer) 指定一个层级结构的根节点(通常是树或图), 然后获取包含根节点在内,根节点所有层级结构中的节点组成的流。 该方法用于以平铺的方式对图或树节点进行访问,可以使用并行流提高效率。static <T> EasyStream<T> iterateHierarchies(T root, Function<T, Collection<T>> discoverer, Predicate<T> filter) 指定一个层级结构的根节点(通常是树或图), 然后获取包含根节点在内,根节点所有层级结构中的节点组成的流。 该方法用于以平铺的方式对图或树节点进行访问,可以使用并行流提高效率。<R> EasyStream<R> 返回与指定函数将元素作为参数执行的结果组成的流 这是一个无状态中间操作static <T> EasyStream<T> 通过实现了Iterable接口的对象创建串行流,若输入对象为null,则返回一个空的串行流static <T> EasyStream<T> 通过传入的Iterable创建流,若输入对象为null,则返回一个空的串行流static <T> EasyStream<T> 通过传入的Stream创建流,若输入对象为null,则返回一个空的串行流static <T> EasyStream<T> of(T t) 返回包含单个元素的串行流static <T> EasyStream<T> of(T... values) 返回包含指定元素的串行流,若输入数组为null或空,则返回一个空的串行流static EasyStream<String> split(CharSequence text, String regex) 拆分字符串,转换为串行流<R extends Number>
BigDecimal计算Number类型的总和doublesum(ToDoubleFunction<? super T> mapper) 计算double类型的总和intsum(ToIntFunction<? super T> mapper) 计算int类型的总和longsum(ToLongFunction<? super T> mapper) 计算long类型的总和根据一个原始的流,返回一个新包装类实例Methods inherited from class org.miaixz.bus.core.center.stream.EnhancedWrappedStream
equals, exec, hashCode, toString, unwrapMethods inherited from class java.lang.Object
clone, finalize, getClass, notify, notifyAll, wait, wait, waitMethods inherited from interface java.util.stream.Stream
mapMultiToDouble, mapMultiToInt, mapMultiToLongMethods inherited from interface org.miaixz.bus.core.center.stream.TerminableWrappedStream
at, findFirst, findFirstIdx, findLast, findLast, findLastIdx, forEachIdx, forEachOrderedIdx, group, group, group, isEmpty, isNotEmpty, join, join, join, partition, partition, partition, toColl, toIdxMap, toIdxMap, toList, toMap, toMap, toMap, toMap, toSet, toUnmodifiableList, toUnmodifiableMap, toUnmodifiableMap, toUnmodifiableSet, toZipMethods inherited from interface org.miaixz.bus.core.center.stream.TransformableWrappedStream
append, distinct, dropWhile, filter, filterIdx, flat, flat, flatMap, flatMapIdx, flatNonNull, flatTree, log, mapIdx, mapMulti, mapNonNull, nonNull, parallel, peekIdx, prepend, push, reverse, splice, split, splitList, takeWhile, toEntries, toEntries, unshift, zipMethods inherited from interface org.miaixz.bus.core.center.stream.WrappedStream
allMatch, anyMatch, close, collect, collect, count, distinct, easyStream, filter, findAny, findFirst, flatMapToDouble, flatMapToInt, flatMapToLong, forEach, forEachOrdered, isParallel, iterator, limit, mapToDouble, mapToInt, mapToLong, max, min, noneMatch, onClose, parallel, peek, reduce, reduce, reduce, sequential, skip, sorted, sorted, spliterator, toArray, toArray, unordered
-
Method Details
-
builder
返回FastStream的建造器- Type Parameters:
T- 元素的类型- Returns:
- a unwrap builder
-
empty
返回空的串行流- Type Parameters:
T- 元素类型- Returns:
- 一个空的串行流
-
of
返回包含单个元素的串行流- Type Parameters:
T- 元素类型- Parameters:
t- 单个元素- Returns:
- 包含单个元素的串行流
-
of
返回包含指定元素的串行流,若输入数组为null或空,则返回一个空的串行流- Type Parameters:
T- 元素类型- Parameters:
values- 指定元素- Returns:
- 包含指定元素的串行流 从一个安全数组中创建流
-
of
通过实现了Iterable接口的对象创建串行流,若输入对象为null,则返回一个空的串行流- Type Parameters:
T- 元素类型- Parameters:
iterable- 实现了Iterable接口的对象- Returns:
- 流
-
of
通过传入的Iterable创建流,若输入对象为null,则返回一个空的串行流- Type Parameters:
T- 元素类型- Parameters:
iterable-Iterableparallel- 是否并行- Returns:
- 流
-
of
通过传入的Stream创建流,若输入对象为null,则返回一个空的串行流- Type Parameters:
T- 元素类型- Parameters:
stream-Stream- Returns:
- 流
-
iterate
返回无限有序流 该流由 初始值 以及执行 迭代函数 进行迭代获取到元素例如
FastStream.iterate(0, i -> i + 1)就可以创建从0开始,每次+1的无限流,使用WrappedStream.limit(long)可以限制元素个数- Type Parameters:
T- 元素类型- Parameters:
seed- 初始值f- 用上一个元素作为参数执行并返回一个新的元素- Returns:
- 无限有序流
-
iterate
public static <T> EasyStream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next) 返回无限有序流 该流由 初始值 然后判断条件 以及执行 迭代函数 进行迭代获取到元素例如
FastStream.iterate(0, i -> i < 3, i -> ++i)就可以创建包含元素0,1,2的流,使用WrappedStream.limit(long)可以限制元素个数- Type Parameters:
T- 元素类型- Parameters:
seed- 初始值hasNext- 条件值next- 用上一个元素作为参数执行并返回一个新的元素- Returns:
- 无限有序流
-
iterateHierarchies
public static <T> EasyStream<T> iterateHierarchies(T root, Function<T, Collection<T>> discoverer, Predicate<T> filter) 指定一个层级结构的根节点(通常是树或图), 然后获取包含根节点在内,根节点所有层级结构中的节点组成的流。 该方法用于以平铺的方式对图或树节点进行访问,可以使用并行流提高效率。eg:
Tree root = // 构建树结构 // 搜索树结构中所有级别为3的节点,并按权重排序 List<Tree> thirdLevelNodes = StreamKit.iterateHierarchies(root, Tree:getChildren) .filter(node -> node.getLevel() == 3) .sorted(Comparator.comparing(Tree::getWeight)) .toList();- Type Parameters:
T- 对象类型- Parameters:
root- 根节点discoverer- 下一层级节点的获取方法filter- 节点过滤器,不匹配的节点与以其作为根节点的子树将将会被忽略- Returns:
- 包含根节点在内,根节点所有层级结构中的节点组成的流
-
iterateHierarchies
指定一个层级结构的根节点(通常是树或图), 然后获取包含根节点在内,根节点所有层级结构中的节点组成的流。 该方法用于以平铺的方式对图或树节点进行访问,可以使用并行流提高效率。eg:
Tree root = // 构建树结构 // 搜索树结构中所有级别为3的节点,并按权重排序 List<Tree> thirdLevelNodes = StreamKit.iterateHierarchies(root, Tree:getChildren) .filter(node -> node.getLevel() == 3) .sorted(Comparator.comparing(Tree::getWeight)) .toList();- Type Parameters:
T- 对象类型- Parameters:
root- 根节点discoverer- 下一层级节点的获取方法- Returns:
- 包含根节点在内,根节点所有层级结构中的节点组成的流
-
generate
返回无限串行无序流 其中每一个元素都由给定的Supplier生成 适用场景在一些生成常量流、随机元素等- Type Parameters:
T- 元素类型- Parameters:
s- 用来生成元素的Supplier- Returns:
- 无限串行无序流
-
concat
创建一个惰性拼接流,其元素是第一个流的所有元素,然后是第二个流的所有元素。 如果两个输入流都是有序的,则结果流是有序的,如果任一输入流是并行的,则结果流是并行的。 当结果流关闭时,两个输入流的关闭处理程序都会被调用。从重复串行流进行拼接时可能会导致深度调用链甚至抛出
StackOverflowException- Type Parameters:
T- 元素类型- Parameters:
a- 第一个流b- 第二个流- Returns:
- 拼接两个流之后的流
-
split
拆分字符串,转换为串行流- Parameters:
text- 字符串regex- 正则- Returns:
- 拆分后元素组成的流
-
map
返回与指定函数将元素作为参数执行的结果组成的流 这是一个无状态中间操作- Type Parameters:
R- 函数执行后返回的类型- Parameters:
mapper- 指定的函数- Returns:
- 返回叠加操作后的流
-
wrap
根据一个原始的流,返回一个新包装类实例- Parameters:
stream- 流- Returns:
- 实现类
-
sum
计算int类型的总和- Parameters:
mapper- 将对象转换为int的Function- Returns:
- int 总和
-
sum
计算long类型的总和- Parameters:
mapper- 将对象转换为long的Function- Returns:
- long 总和
-
sum
计算double类型的总和- Parameters:
mapper- 将对象转换为double的Function- Returns:
- double 总和
-
sum
计算Number类型的总和- Type Parameters:
R- 数字- Parameters:
mapper- 将对象转换为Number的Function- Returns:
BigDecimal, 如果流为空, 返回BigDecimal.ZERO
-
avg
计算BigDecimal类型的平均值 并以四舍五入的方式保留2位精度- Parameters:
mapper- 将对象转换为BigDecimal的Function- Returns:
- 计算后的平均值 如果流的长度为0, 返回
Optional.empty()
-
avg
BigDecimal类型的平均值 并以四舍五入的方式保留小数点后scale位- Parameters:
mapper- 将对象转换为BigDecimal的Functionscale- 保留精度- Returns:
- 计算后的平均值 如果流的长度为0, 返回
Optional.empty()
-
avg
public Optional<BigDecimal> avg(Function<? super T, BigDecimal> mapper, int scale, RoundingMode roundingMode) 计算BigDecimal类型的平均值- Parameters:
mapper- 将对象转换为BigDecimal的Functionscale- 保留精度roundingMode- 舍入模式- Returns:
- 计算后的平均值 如果元素的长度为0 那么会返回
Optional.empty()
-
avg
计算int类型的平均值- Parameters:
mapper- 将对象转换为int 的Function- Returns:
OptionalDouble如果流的长度为0 那么会返回OptionalDouble.empty()
-
avg
计算double类型的平均值- Parameters:
mapper- 将对象转换为double 的Function- Returns:
OptionalDouble如果流的长度为0 那么会返回OptionalDouble.empty()
-
avg
计算double平均值- Parameters:
mapper- 将对象转换为long 的Function- Returns:
OptionalDouble如果流的长度为0 那么会返回OptionalDouble.empty()
-