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,并同時執(zhí)行一個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進行規(guī)約操作
-
Optional<T> reduce(BinaryOperator<T> accumulator)
對Stream進行規(guī)約操作
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner)
對Stream進行規(guī)約操作
-
<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