Java學習之隨堂筆記系列——day23

昨天內容回顧:
    1、Lambda表達式 jdk1.8之後的新特性
        Lambda表達式的前提:
            1 Lambda表達式必須是接口類型。
            2、接口中有且僅有一個抽象方法。
        Lambda表達式的語法:
            (方法的參數列表)->{方法體}
        Lambda表達式的簡化格式:
            1、任意情況下,參數列表中的參數類型都可以省略。
            2、如果參數列表只有一個參數,那麼()可以省略。
            3、如果方法體中有且僅有一條語句,那麼{}和;一起省略,如果有return,那麼return也要一起省略。
        Lambda表達式的好處:
            簡化匿名內部類的書寫,但是不能完全替代匿名內部類。
        lambda表達式和匿名內部類的區別:
            1、能使用Lambda表達式的地方就一定可以使用匿名內部類,但是能使用匿名內部類的地方不一定能使用Lambda表達式。
            2、匿名內部類編譯之後有class文件,lambda表達式編譯之後不會產生class文件。
    2、接口新特性
        默認方法:
        靜態方法:
        私有方法:
    3、方法引用:
        方法引用的好處:
            方法引用可以替換部分的Lambda表達式的書寫。
        使用場景:
           如果Lambda表達式的的方法體中有且僅有一條語句,且符合 對象.方法() 、類名 .方法() 、new 類名() ,那麼就可以使用方法引用
           代替Lambda表達式
        語法:
            對象.方法()------>對象::方法名    例如:System.out::println   注意:不需要寫()
            類名 .方法()----->類名::方法名    例如:Integer::parseInt
            new 類名()------>類名::new      例如:Student::new
今日內容:
    1、函數式接口
       1、概念:有且僅有一個抽象方法的接口就叫做函數式接口。可以使用@FunctionalInterface註解檢查。
            注意:一個接口是不是函數式接口和@FunctionalInterface沒有任何關係,只和抽象方法的個數有關。如果這個接口不是函數式接口,
                那麼加上這個註解之後就會編譯報錯。

            例如:JDK中的Runnable接口就是一個函數式接口
                @FunctionalInterface
                public interface Runnable {
                    public abstract void run();
                }
       2、使用場景:作爲方法的參數或者返回值
       3、JDK中常見的函數式接口
            Supplier<T>:生產型接口
               T get():get()方法不需要給參數,反而給你返回一個T類型的值。
            Consumer<T>:消費型接口
                void accept(T t):需要一個T類型的參數,沒有返回值,通過accept將T類型的數據交給我們使用(消費) (掌握)
                default Consumer<T> andThen(Consumer<? super T> after):將兩個Consumer連接,分別消費數據

                例如:
                    //遍歷輸出  (T t)
                    list.forEach(num->System.out.println(num));
                    System.out.println("--------------");
                    //方法引用
                    list.forEach(System.out::println);

            Predicate<T>:判斷型接口
                boolean test(T t):將給定的T類型的參數在test方法中進行條件判斷,返回判斷結果。

            Function<T,R>:轉換型接口
                R apply(T t):將T類型的參數傳遞給方法,轉換成R類型之後返回。

    2、Stream流
        概念:Stream流就是一套操作集合的工具集。工具集:指的就是Stream流中已經封裝好了很多操作集合的方法,我們當作工具直接用就行了。
        Stream流操作的對象:單列集合、數組、Map集合(只能間接操作)。
        使用注意事項:Stream流對象只能被使用一次,否則會出現如下異常:
            java.lang.IllegalStateException: stream has already been operated upon or closed
        Stream流操作的步驟:
            1、生成Stream流對象
                Stream<T> stream=單列集合對象.stream();
                Stream<T> stream=Stream.of(T... t);
                注意:Map集合必須要先轉換成單列集合(keySet()或者entrySet())之後纔可以生成Stream流對象。
            2、調用Stream流對象的方法
                Stream<T> filter​(Predicate predicate):用於對流中的數據進行過濾,需要使用Predicate接口傳遞過濾條件
                Stream<T> limit​(long maxSize):截取前指定參數個數的數據,返回截取的元素組成的新流
                Stream<T> skip​(long n):跳過指定參數個數的數據,返回由該流的剩餘元素組成的新流
                static <T> Stream<T> concat​(Stream a, Stream b):合併a和b兩個流爲一個流
                Stream<T> distinct​():對流中的元素去重(根據Object.equals(Object) )組成的流
                Stream<T> sorted​():返回由此流的元素組成的流,根據自然順序排序
                Stream<T> sorted​(Comparator comparator):返回由該流的元素組成的流,根據提供的Comparator進行排序
                Stream<R> map​(Function mapper):將流中的數據轉換成另一種類型進行存儲,返回新的流對象。
                        Function轉換型接口中的方法        R apply​(T t)
                void forEach​(Consumer action):遍歷消費流中的數據
                long count​():返回此流中的元素個數

            3、將流中的數據轉換成集合(可選操作)
                List<String> listA = streamA.collect(Collectors.toList());
                Set<Integer> setB = streamB.collect(Collectors.toSet());

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章