Java8新特性lambda stream 函式介面學習
阿新 • • 發佈:2019-01-05
Lambda表示式:
格式為:expression = (variable) -> action
含義就是將幾個變數通過action程式碼中的邏輯,計算出結果返回給expression表示式。
變數為一個時,可以不加括號。
List<Integer> list = Arrays.asList(1,2,5,8,7,4); Collections.sort(list,(a,b) -> a.compareTo(b)); list.forEach(System.out::print); new Thread(() -> System.out.println("執行!")).start();
函式介面:
function:傳入一段程式碼組成的函式,返回一個值。和數學的函式作用相似。
consumer:消費者,消費引數。傳入引數,沒有返回值,但發揮作用,例如forEach,輸出了語句。
supplier:提供者,提供引數。不需要傳入引數,會返回一個值。例如get()。
predicate:斷言。傳入引數,通過函式中定義的程式碼判斷,返回boolen型別。
stream:
對集合的增強,類似高階版的iterate。可以與lambda表示式配合使用。格式:
stream:建立集合或物件的流。
filer為過濾器,根據條件,篩選元素。
count:統計符合條件的元素數量。
reduce:歸約,將流通過運算轉化為值。
map:對元素進行運算。
mapToInt,mapToDouble,mapToLong:將元素轉換為int,double,long。
List<Integer> list = Arrays.asList(1,2,5,null,3,null,8,4); //統計非空數量 System.out.println(list.stream().filter(num -> num != null).count()); //篩選出非空元素 List<Integer> list2 = list.stream().filter(num -> num != null).collect(Collectors.toList()); System.out.println(Arrays.toString(list2.toArray())); //將非空元素的最大值 int max = list2.stream().max((a,b) -> a.compareTo(b)).get(); System.out.println(max); //獲取最小值 int min = list2.stream().reduce(0,Integer::min); //求和 int sum = list2.stream().reduce(0,(a,b) -> a + b); System.out.println("sum:"+sum); //獲取非空元素的前3大的數字 List<Integer> list3 = list2.stream().sorted((a,b) -> b.compareTo(a)).limit(3).collect(Collectors.toList()); System.out.println(Arrays.toString(list3.toArray())); //將list轉換為map Map<Integer,Integer> map = list2.stream().collect(Collectors.toMap(a -> a.intValue(),b -> b.intValue())); map.forEach((k,v)-> System.out.print("key:"+k+" value:"+v)); System.out.println(); //將list中的元素進行平方運算 List<Integer> list4 = list.stream().filter(num -> num != null).map(num -> num * num).collect(Collectors.toList()); list4.forEach(System.out::print); System.out.println(); //將全部元素轉換為double,節省拆箱裝箱成本 list2.stream().mapToDouble(a -> a.intValue()).forEach(System.out::print);