1. 程式人生 > >Java8新特性lambda stream 函式介面學習

Java8新特性lambda stream 函式介面學習

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);