流表面看起來和集合類似
1.流並不存儲其元素,這些元素可能存儲在底層的集合中,或者按需生成
2.流的操作不會修改其數據源
3.流的操作是儘可能的惰性執行,意味着直至需要結果時,操作纔會執行。
操作流時的典型流程
1.創建一個流
2.指定將初始流轉換爲其他流的中間操作,可能包含多個步驟
3.應用終止操作,從而產生結果。這個操作會強制執行之前的惰性操作。
Stream(),parallelStream(),產生當前集合所有元素的順序流或者並行流
流的轉換會產生一個新的流,它的元素派生於另一個流中的元素,
Filter 產生一個流,包含當前流中所有滿足斷言條件的元素。
Map產生一個流,應用於當前流中所有元素所產生的的結果
FlatMap <Function<? super T,? extends Stream<? extends R>> mapper>
通過將mapper應用於當前流中所有元素產生的結果連接到一起而獲得的。
調用stream.limit會返回一個新的流,在n個元素之後結束。對於裁剪無限流的尺寸非常有用
Stream randoms = Stream.generate(Math::random).limit(100);
會產生一個包含100個隨機數的流
Stream.skip(n)正好相反,會丟棄前n個元素
可以使用concat方法將兩個流連接起來
Stream combined = Stream.concat(letter(“Hello”), letter(“World”));
Diatinct會返回一個流,剔除重複元素按順序產生,
流的排序
Stream long = words.stream().sorted(Compartator.comparing(String::length).reversed());
最長的字符串排在最前面
Count 會返回流中元素的數量
Max和min 返回最大值和最小值。返回的是一樂類型Optional的值
FindFirst返回的是非空集合中的第一個值
OPtional start = words.filter(s -> s.startsWith(“Q”)).findFirst;
找到第一個以Q開頭的單詞
不強調第一個匹配,任意一個匹配都可以,就使用findAny方法
只想知道是否匹配使用anyMatch。
所有元素 allMatch
沒有任何元素 noneMatch
這3個都是boolean類型,返回true,終端操作,
Optional類型
Optional對象是一種包裝器對象,要麼包裝了類型T的對象,要麼沒有包裝任何對象。
result = noVowels().limit(10)
.collect(Collectors.joining(", "));
joining的作用就是加分隔符。
Long getCount() 產生彙總後的元素個數
getSum(),Getaverage()產生彙總後的元素的總合或者平均值,或者在沒有任何元素時返回0
getMax(),getMin(),獲得彙總的最大值和最小值。
GroupingBy產生一個蒐集器。
Counting會對產生蒐集到的元素個數。
Map<String, Long> Counts = locales.collect(groupingBy(Locale::getCountry,counting()));
maxBy和minBy會接受一個比較器,併產生下游元素中的最大值或最小值
Map<String,Optional> stateTo = cities.collect(groupingBy(City::getState,MaxBy(Comparator.comparing(City::getPopulation()))));
這個可以產生每個州最大的城市。
Reduce 方法是一種用於從流中計算某個值的通用機制,
Optional sum = values.stream().reduce((x,y) ->x + y);
當你有一個對象流的時候,可以使用mapToInt,mapToLong和mapToDouble將其轉換爲基本類型。
Range(),rangeClosed(),產生一個由給定範圍內的整數構成的XXXStream。