Stream详解
Java 8引入了全新的Stream API。这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同.
我们先来看看Java里面是怎么定义Stream的:
A sequence of elements supporting sequential and parallel aggregate operations.
我们来解读一下上面的那句话:
Stream是元素的集合,这点让Stream看起来用些类似Iterator;
可以支持顺序和并行的对原Stream进行汇聚的操作;
Stream
BaseStream的核心接口方法:
- Iterator
iterator();
表明Stream能够进行迭代操作
- Spliterator
spliterator();
表明Stream能够进行分割迭代
- boolean isParallel();
判断Stream是否是并行的Stream
- S sequential();
获取串行的Stream
- S parallel();
获取并行的Stream
- S unordered();
获取无序的Stream
- S onClose(Runnable closeHandler);
返回一个同样的Stream,并同时执行一个Runnable
以下是Stream的的核心接口方法:
- Stream
filter(Predicate predicate)
在Stream中过滤符合指定条件的元素
-
Stream map(Function mapper)
将Stream中的元素转换成另一种数据格式
- IntStream mapToInt(ToIntFunction mapper)
将Stream中的元素转换成int类型的值
- LongStream mapToLong(ToLongFunction mapper)
将Stream中的元素转换成long类型的值
- DoubleStream mapToDouble(ToDoubleFunction mapper)
将Stream中的元素转换成double类型的值
-
Stream flatMap(Function> mapper)
将stream中的元素转换成stream
- IntStream flatMapToInt(Function mapper)
将stream中的元素转换成int类型的stream
- LongStream flatMapToLong(Function mapper)
将stream中的元素转换成long类型的stream
- DoubleStream flatMapToDouble(Function mapper)
将stream中的元素转换成double类型的stream
- Stream
distinct()
将Stream中重复的元素去除掉
- Stream
sorted()
对Stream中的元素进行排序
- Stream
sorted(Comparator comparator)
- Stream
peek(Consumer action)
对Stream中的元素都调用指定的方法,不影响原有元素内容
- Stream
limit(long maxSize)
限制Stream的元素内容的大小
- Stream
skip(long n)
获取跳过指定长度的Stream
- void forEach(Consumer action)
遍历处理Stream中的元素
- void forEachOrdered(Consumer action)
按照顺序遍历处理Stream中的元素
- Object[] toArray()
将Stream转换成对象数组
- A[] toArray(IntFunction generator)
将Stream 转换成指定对象的数组
- T reduce(T identity, BinaryOperator
accumulator)
对Stream进行规约操作
- Optional
reduce(BinaryOperator accumulator)
对Stream进行规约操作
- U reduce(U identity,
BiFunction accumulator,
BinaryOperator combiner)
-
R collect(Supplier supplier,
BiConsumeraccumulator,
BiConsumercombiner)
通过指定的收集器,收集Stream的内容
-
R collect(Collector collector)
通过指定的收集器,收集Stream的内容
- Optional
min(Comparator comparator)
通过指定的比较器获取元素的最小值
- Optional
max(Comparator comparator)
- long count()
- boolean anyMatch(Predicate predicate)
判断Stream中是否含有指定要求的元素
- boolean allMatch(Predicate predicate)
判断Stream中所有元素是否符合指定要求
- boolean noneMatch(Predicate predicate)
判断Stream中所有元素是否都不符合指定要求
- Optional
findFirst()
获取Stream中的第一个元素
- Optional
findAny()
随机获取Stream中的一个元素
- public static
Builder builder()
获取一个Stream的构造器
- public static
Stream empty()
获取一个空的Stream
- public static
Stream of(T t)
- public static
Stream of(T... values)
向一个Stream中添加元素列表
- public static
Stream iterate(final T seed, final UnaryOperator f)
迭代Stream
- public static
Stream generate(Supplier s)
根据指定需求生成一个Stream
- public static
Stream concat(Stream a, Stream b)
下面就通过具体实例来看每个方法的使用方式:
Person类:
filter(Predicate predicate)
获取一批用户中年龄大于23的人数
System.out.println(
Arrays.asList(
new Person(22,"lisi"),
new Person(23,"zhangsan"),
new Person(25,"wangwu"),
new Person(24,"zhouliu"),
new Person(27,"zhaoqi")
).stream()
.filter(x -> x.age > 23)
.count()
);
结果为:
3