java新特性-----stream
stream是什麼?
1:流是”從支援資料處理操作的源 生成的一系列操作“
A sequence of elements supporting sequential and parallel aggregate operations是支援順序和並行聚合操作的元素序列,
2:流操作型別:中間操作和終端操作
filter,map,limit,sorted,distinct可以連成一條流水線,collect,forEach,count觸發流水線執行並關閉它。
注意:一個流只能遍歷一次,流中元素按需計算。
3:流的內部迭代與外部迭代:使用Collection介面需要使用者去做迭代(比如用for-each)稱外部迭代,Stream用的是內部迭代
外部迭代:List<String> names= new ArrayList<>();
for(Dish d:menu){
names.add(d.getName());
}
內部迭代:List<String> names=menu.stream().map(Dish::getName).collection(toList());
4:使用
(1)篩選:filter謂詞篩選,distinct去重,limit截斷,skip跳過。
// stream()方法是Collection介面的一個預設方法 : Stream<T> filter(Predicate<? super T> // predicate);
//filter方法引數是一個Predicate函式式介面並繼續返回Stream介面
// 解釋:從字串序列中過濾出以字元a開頭的字串並迭代列印輸出 stringList.stream().filter((s) ->
stringList.stream().filter((s) -> s.startsWith("a")).forEach(System.out::println);
(2)對映:map,flatmap
// 解釋:將集合元素轉為大寫(每個元素對映到大寫)->降序排序->迭代輸出不影響原來集合 stringList.stream().map(String::toUpperCase).sorted((a, b) -> b.compareTo(a)).forEach(System.out::println);
String[] words={"hello","world"}; //講一個數組轉化成一個數組流 List<String> uni= Arrays.stream(words).map(w->w.split(" ")).flatMap(Arrays::stream).distinct().collect(Collectors.toList());
使用flatmap的效果是將各個陣列並不是分別對映成一個流,而是對映成流的內容,簡而言之就是把一個流中的每一個值都轉換成另一個流然後所有流連線成一個新流。
(3)匹配和查詢:檢查謂詞是否匹配所有元素allMatch,檢查謂詞是否至少匹配一個元素anyMatchh,流中沒有任何元素與給定的謂詞匹配noneMatch,查詢第一個元素findFirst,查詢當前流任一元素findAny。所有的匹配操作都是終結操作,只返回一個boolean型別的結果
(4)規約:reduce,count
// 解釋:返回集合中以'a'開頭元素的數目 long startsWithACount = stringList.stream().filter((s) -> s.startsWith("a")).count(); System.out.println(startsWithACount); System.out.println(stringList.stream().count());
(5)sort排序