Stream是集合元素的函數模型,支持順序和並行聚合操做的元素序列,不是集合,能夠簡單的理解爲高級版的Iterator;java
當咱們使用一個流的時候,一般包括三個基本步驟:獲取一個數據源(source)→ 數據轉換→執行操做獲取想要的結果數組
每次轉換原有 Stream 對象不改變,返回一個新的 Stream 對象(能夠有屢次轉換),這就容許對其操做能夠像鏈條同樣排列,變成一個管道app
1. JDK8以後,在Collection<E>接口增長了一個默認的方法: default Stream<E> stream() 能夠將集合轉化爲流;函數
2. JDK8以後,API提供了一個新的接口java.util.stream,該接口中有一個靜態方法of(T...values)能夠獲取Stream流spa
Collection & 數組 & 其餘對象
Stream API方法能夠分爲2類blog
延遲方法:返回值仍然是Stream流,所以能夠支持鏈式調用;接口
終結方法:的返回值再也不是Stream流自己,所以不在支持鏈式調用,包括count()、forEach()、collect()、reduce()、*Match()、find*();ip
Stream<T> filter(Predicate<? super T> predicate) 該方法將一個流轉化爲另外一個子集流it
<R> Stream<R> map(Function<? supper T, ? extends R) mapper);該方法將流中的元素映射到另外一個流中;
Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper) 方法將子流合併到主流中
Stream<T> limit(long maxSize) 方法能夠對流中元素進行截取,只取前N個;
`
Steam<T> skip(long n) 方法表示跳過流中前n個元素,保留以後的元素;
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) 該方法將兩個流合併成一個流;
long cout() 該方法用來統計流中有幾個元素;
void forEach(Consumer<? super T> action) 該方法接受一個Consumer接口函數,每一個流元素都交給該函數處理;