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<T>接口继承自BaseStream<T, S extends BaseStream<T, S>>,而BaseStream接口则是Stream的基本定义接口.
BaseStream的核心接口方法:
-
Iterator<T> iterator();
表明Stream能够进行迭代操作
-
Spliterator<T> spliterator();
表明Stream能够进行分割迭代
-
boolean isParallel();
判断Stream是否是并行的Stream
-
S sequential();
获取串行的Stream
-
S parallel();
获取并行的Stream
-
S unordered();
获取无序的Stream
-
S onClose(Runnable closeHandler);
返回一个同样的Stream,并同时执行一个Runnable
而Stream<T>继承了BaseStream<T, Stream<T>,则说明Stream具有BaseStream接口中所描述的方法的能力. 并且Stream对其进行了扩展,如果说BaseStream只是定义了流(Stream)具有哪些能力,则Stream接口则定义了一个具体的流能做哪些事情.
以下是Stream的的核心接口方法:
-
Stream<T> filter(Predicate<? super T> predicate)
在Stream中过滤符合指定条件的元素
-
<R> Stream<R> map(Function<? super T, ? extends R> mapper)
将Stream中的元素转换成另一种数据格式
-
IntStream mapToInt(ToIntFunction<? super T> mapper)
将Stream中的元素转换成int类型的值
-
LongStream mapToLong(ToLongFunction<? super T> mapper)
将Stream中的元素转换成long类型的值
-
DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper)
将Stream中的元素转换成double类型的值
-
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
将stream中的元素转换成stream
-
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper)
将stream中的元素转换成int类型的stream
-
LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper)
将stream中的元素转换成long类型的stream
-
DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper)
将stream中的元素转换成double类型的stream
-
Stream<T> distinct()
将Stream中重复的元素去除掉
-
Stream<T> sorted()
对Stream中的元素进行排序
-
Stream<T> sorted(Comparator<? super T> comparator)
对Stream中的元素进行指定比较器进行排序
-
Stream<T> peek(Consumer<? super T> action)
对Stream中的元素都调用指定的方法,不影响原有元素内容
-
Stream<T> limit(long maxSize)
限制Stream的元素内容的大小
-
Stream<T> skip(long n)
获取跳过指定长度的Stream
-
void forEach(Consumer<? super T> action)
遍历处理Stream中的元素
-
void forEachOrdered(Consumer<? super T> action)
按照顺序遍历处理Stream中的元素
-
Object[] toArray()
将Stream转换成对象数组
-
<A> A[] toArray(IntFunction<A[]> generator)
将Stream 转换成指定对象的数组
-
T reduce(T identity, BinaryOperator<T> accumulator)
对Stream进行规约操作
-
Optional<T> reduce(BinaryOperator<T> accumulator)
对Stream进行规约操作
-
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner)
对Stream进行规约操作
-
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner)通过指定的收集器,收集Stream的内容
-
<R, A> R collect(Collector<? super T, A, R> collector)
通过指定的收集器,收集Stream的内容
-
Optional<T> min(Comparator<? super T> comparator)
通过指定的比较器获取元素的最小值
-
Optional<T> max(Comparator<? super T> comparator)
通过指定的比较器获取元素的最大值
- long count()
获取Stream的元素内容大小
-
boolean anyMatch(Predicate<? super T> predicate)
判断Stream中是否含有指定要求的元素
-
boolean allMatch(Predicate<? super T> predicate)
判断Stream中所有元素是否符合指定要求
-
boolean noneMatch(Predicate<? super T> predicate)
判断Stream中所有元素是否都不符合指定要求
-
Optional<T> findFirst()
获取Stream中的第一个元素
-
Optional<T> findAny()
随机获取Stream中的一个元素
-
public static<T> Builder<T> builder()
获取一个Stream的构造器
-
public static<T> Stream<T> empty()
获取一个空的Stream
-
public static<T> Stream<T> of(T t)
向一个Stream中添加元素
-
public static<T> Stream<T> of(T... values)
向一个Stream中添加元素列表
-
public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)
迭代Stream
-
public static<T> Stream<T> generate(Supplier<T> s)
根据指定需求生成一个Stream
-
public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
连接两个Stream成一个Stream
下面就通过具体实例来看每个方法的使用方式:
Person类:
filter(Predicate<? super T> 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