一、流的创建
1.1 由值创建流
//由值创建流
Stream<Integer> integerStream = Stream.of(1, 2, 3);
Stream.empty();
//流构造器
Stream.<Integer>builder()
.add(1)
.add(2)
.add(3)
.build();
1.2 由数组、列表、文件创建
//由数组创建流
Stream<String> arrayStream = Arrays.stream(strs);
//由列表创建流
Stream<String> listStream = list.stream();
//由文件创建
Stream<String> fileStream = Files.lines(Path.of("D:\\1.txt"));
1.3 由函数创建
//生成
Stream.generate(Math::random);
//迭代
Stream.iterate(1,n->n+1);
IntStream.range(1,5);
Stream.iterate(1,n->n+1).skip(5).limit(5);
二、流操作
2.1 基础操作
Distinct
中间操作,通过检查equals()方法返回由不同元素组成的流。
Filter
中间操作,返回与指定谓词匹配的流。
flatMap
中间操作,生成流扁平化。
Limit
中间操作,按数字截断流。
Map
中间操作,对流执行一对一映射
Peek
peek方法返回由该流的元素组成的流,并对每个元素执行所提供的 Consumer操作方法。
Skip
中间操作,丢弃前n个元素并返回剩余流。如果此流包含少于请求的流,则返回空流。
Sorted
中间操作,根据自然顺序或指定的比较器对流进行排序。对于有序流,排序是稳定的。
allMatch
终端操作,如果流中的所有元素都匹配指定的谓词,则返回true,否则返回false。如果流为空,则返回true。
anyMatch
终端操作,如果流中的任何元素与指定的谓词匹配,则返回true,否则返回false。如果流为空,则返回false。
findAny
终端操作,返回流中的任何元素。返回空流的一个空的Optional对象。
findFirst
终端操作,返回流的第一个元素。对于有序流,它返回第一个元素;对于无序流,它返回任何元素。
noneMatch
终端操作,如果流中没有元素匹配指定的谓词,则返回true,否则返回false。如果流为空,则返回true。
forEach
终端操作,对流中的每个元素应用操作。
Reduce
终端操作,应用缩减操作以从流计算单个值。
Max,min,average,count
终端操作
2.2 规约操作
收集器
<R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
<R,A> R collect(Collector<? super T,A,R> collector)
收集器中的Collector类由工具类Collectors生成,Collectors中生成Collectors的函数如下图
2.2.1 流转换
collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher)
mapping(Function<?superT,?extendsU>mapper, Collector<?superU,A,R>downstream)
reducing(BinaryOperator<T>op)
例子:
2.2.2 分组
partitioningBy(Predicate<? super T> predicate)
partitioningBy(Predicate<? super T> predicate, Collector<? super T,A,D> downstream)
groupingBy(Function<? super T,? extends K> classifier)
groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
groupingBy(Function<? super T,? extends K> classifier, Supplier<M> mapFactory, Collector<? super T,A,D> downstream)
举例:
2.2.3 连接
joining()
连接所有元素
joining(CharSequence delimiter)
使用在两个元素之间使用的分隔符。
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
使用分隔符,前缀和后缀。 前缀将添加到开头,后缀将添加到结尾。
举例:
2.2.4 收集器
toCollection(Supplier<C>collectionFactory)
toList()
toSet()
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction)
toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)
举例:
2.2.5 流统计
counting()
minBy(Comparator<?superT>comparator)
maxBy(Comparator<?superT>comparator)
summingInt(ToIntFunction<?superT>mapper)
summingLong(ToLongFunction<?superT>mapper)
summingDouble(ToDoubleFunction<?superT>mapper)
averagingInt(ToIntFunction<?superT>mapper)
averagingLong(ToLongFunction<?superT>mapper)
averagingDouble(ToDoubleFunction<?superT>mapper)
DoubleSummaryStatistics
LongSummaryStatistics
IntSummaryStatistics