中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8新特性Lambda表達式怎么應用

發布時間:2023-04-18 11:13:04 來源:億速云 閱讀:105 作者:iii 欄目:開發技術

這篇文章主要介紹“Java8新特性Lambda表達式怎么應用”,在日常操作中,相信很多人在Java8新特性Lambda表達式怎么應用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java8新特性Lambda表達式怎么應用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

    一、簡介

    Java 8 (又稱為 jdk 1.8) 是 Java 語言開發的一個主要版本。 Oracle 公司于 2014 年 3 月 18 日發布 Java 8 ,它支持函數式編程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。

     特征

    • 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。

    • 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。

    • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。

    • 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定表達式返回了一個數值。

     注意:Lambda表達式適用于只有一個抽象方法的接口!!

    引入

    自定義接口

    interface Fu{
        void add();
    }

    使用匿名內部類實現接口

    Fu fu = new Fu() {
                @Override
                public void add() {
                    System.out.println("我是add方法");
                }
            };
            fu.add();

    使用Lambda表達式實現接口

            Fu fu1 = ()->{
                System.out.println("我是add1方法");
            };
            fu1.add();

    Lambda表達式的總結

    • Lambda表達式基于數學中的 入 演化得名的,對應Java中的lambda抽象,是一個匿名函數,就是沒有函數名的函數。

    • 好處

      • 使代碼更加簡潔緊湊,且可與Stream API等相結合,Lambda表達式經常代替匿名內部類使用

    • 語法

      • (參數)->表達式或者(參數)->{語句體;}

      • 參數:要重寫方法的參數列表

      • ->:Lambda表達式的運算符

      • 表達式或語句體:要實現的方法的方法體

    • 本質

      • 是一種匿名函數(不是匿名內部類),簡單說,它沒有聲明的方法、沒有訪問修飾符、返回值聲明和名字,它是屬于函數式編程的概念

    三、Lambda表達式的使用

    無參、無返回值

    接口

    interface F{
        void add();
    }

    測試

            //無參無返回值
            F f = ()->{
                System.out.println("我是add方法");
            };
            f.add();

    有參無返回值

    接口

    interface F{
        void add(int a);
    }

    測試

            F f = (int a)->{
                System.out.println("a="+a);
            };
            f.add(12);

    無參數有返回值

    接口

    interface F{
        int add();
    }

    測試

            F f = ()->{
                return 12;
            };
            int i = f.add();
            System.out.println(i);

    有參數有返回值

    接口

    interface F{
        int add(int a);
    }

    測試

            F f = (int a)->{
                return 12+a;
            };
            int i = f.add( 12 );
            System.out.println(i);

    四、Lambda表達式的注意事項

    • Lambda表達式中 () 的參數類型可以省略 (int a,int b)==>(a,b)

    • 接口中如果只有一個參數,Lambda表達式中 () 可以省略  (int a)==> (a)==>a

    • 如果方法體中只有一條執行語句時 外層的 {} 可以省略

    • 如果方法體中只有一條返回語句,{}和return 都可以省略

     五、函數式接口

    函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,可以有其他普通方法,用@FunctionalInterface檢驗是否是函數式接口。

    @FunctionalInterface
    interface F1{
        void t1();
        
        default void t2(){//不計
            
        }
        static void t3(){//不計
            
        }
        public boolean equals(Object object);//不計
    }

    作用:在Java中主要用在Lambda表達式和方法引用。

    內置函數式接口

    • Consumer<T>:消費型接口(void accept(T t))。有參數,無返回值

    • Supplier<T>:供給型接口(T get())。有參數,無返回值

    • Function<T,R>:函數型接口(R apply(T t))。一個輸入參數,一個輸出參數,兩種類型可以一致,也可以不一致

    • Predicate<T>:斷言型接口(boolean test(T t))。輸入一個參數,輸出一個boolean類型的返回值

    函數式接口使用場景

    消費型接口

    //函數式接口的使用場景
    public class Test03 {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<>();
            Collections.addAll(list,1,2,3,6,5,4,8,9);
            //匿名內部類
            Consumer<Integer> con = new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) {
                    //參數代表集合中的每一個數據
                    System.out.print(integer+" ");
                }
            };
            list.forEach( con );
            System.out.println();
            System.out.println("==================");
            //Lambda表達式1
            Consumer cons = (y)->{
                System.out.print(y+" ");
            };
            list.forEach( cons );
            System.out.println();
            System.out.println("==================");
            //Lambda表達式2
            list.forEach( y-> System.out.print(y+" ") );
        }
    }

    斷言型接口

    public class Test04 {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<>();
            Collections.addAll(list,1,2,3,6,5,4,8,9);
            //匿名內部類
            Predicate<Integer> predicate = new Predicate<Integer>() {
                @Override
                public boolean test(Integer integer) {
                    //參數o代表集合中的每一個數
                    if (integer<=6){
                        return true;//刪除該數據
                    }
                    return false;//不刪除該數據
                }
            };
            list.removeIf(predicate);
            list.forEach( x-> System.out.println(x) );
            System.out.println("=================");
     
            //Lambda表達式
            list.removeIf( y->{
                if (y<=6){
                    return true;
                }
                return false;
            } );
            list.removeIf(predicate);
            list.forEach( x-> System.out.println(x) );
            System.out.println("=================");
        }
    }

    六、方法調用

    方法引用通過方法的名字來指向一個方法。方法引用可以使語言的構造更緊湊簡潔,減少冗余代碼。方法引用使用一對冒號 :: 。

    //方法引用
    public class Test05 {
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<>();
            Collections.addAll(list,4,8,9);
     
            //使用Lambda表達式
            list.forEach( x-> System.out.println(x) );
            System.out.println("==================");
            //方法引用
            //使用場景,參數傳遞過來不做任何處理,直接輸出的就可以使用方法引用
            list.forEach(System.out::println);
        }
    }

    構造器引用:它的語法是Class::new,或者更一般的Class< T >::new

    final Car car = Car.create( Car::new ); final List< Car > cars = Arrays.asList( car );

    靜態方法引用:它的語法是Class::static_method

    cars.forEach( Car::collide );

    特定類的任意對象的方法引用:它的語法是Class::method

    cars.forEach( Car::repair );

    特定對象的方法引用:它的語法是instance::method

    final Car police = Car.create( Car::new ); cars.forEach( police::follow );

    七、Stream流式編程

    什么是 Stream?

    Stream(流)是一個來自數據源的元素隊列并支持聚合操作

    • 元素是特定類型的對象,形成一個隊列。 Java中的Stream并不會存儲元素,而是按需計算。

    • 數據源 流的來源。 可以是集合,數組,I/O channel, 產生器generator 等。

    • 聚合操作 類似SQL語句一樣的操作, 比如filter, map, reduce, find, match, sorted等。

    和以前的Collection操作不同, Stream操作還有兩個基礎的特征:

    • Pipelining: 中間操作都會返回流對象本身。 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style)。 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting)。

    • 內部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代。 Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實現。

     使用 Stream流的步驟

    • 創建Stream:從一個數據源(集合、數組)中獲取

    • 中間操作:一個操作的中間鏈,對數據源的數據進行處理

    • 終止操作:一個終止操作,執行中間操作鏈,并產生結果

     排序去重

    //Stream 流式編程
    public class StreamTest01 {
        public static void main(String[] args) {
            //需求:有一堆數據,且有重復值,要求有序去除重復值
            List<Integer> list = new ArrayList<>();
            Collections.addAll(list,56,89,75,64,24,25,24,89,56,75);
     
            //流式編程處理
            //獲取stream
            Stream<Integer> stream = list.stream();
            //中間操作
            stream = stream.distinct()//去重操作
                            .sorted();//排序
            //終止操作
            stream.forEach( x->{//輸出集合中元素
                System.out.println(x);
            } );
        }
    }

    中間操作

            stream = stream.distinct()//去重操作
                            .sorted();//排序
            .limit( 4 );//取前四個元素
            .skip( 2 );//跳過前幾個元素
            .map( x->x+4 );//每一個元素加上特定的值
            .filter( x->{//過濾操作,true正常返回,false不返回
                if (x>=25){
                    return true;
                }
                return false;
            } );

    八、串行流和并行流

    串行流

            Stream<Integer> stream = list.stream();//串行流

    并行流

            Stream<Integer> stream1 = list.parallelStream();//并行流

    九、Optional 類

    • Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。

    • Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

    • Optional 類的引入很好的解決空指針異常。

      Optional 類的方法

    • static <T> Optional<T> empty()        返回空的 Optional 實例。

    • boolean equals(Object obj)        判斷其他對象是否等于 Optional。

    • Optional<T> filter(Predicate<? super <T> predicate)        如果值存在,并且這個值匹配給定的 predicate,返回一個Optional用以描述這個值,否則返回一個空的Optional。

    • <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)        如果值存在,返回基于Optional包含的映射方法的值,否則返回一個空的Optional

    • T get()        如果在這個Optional中包含這個值,返回值,否則拋出異常:NoSuchElementException

    • int hashCode()        返回存在值的哈希碼,如果值不存在 返回 0。

    • void ifPresent(Consumer<? super T> consumer)        如果值存在則使用該值調用 consumer , 否則不做任何事情。

    • boolean isPresent()        如果值存在則方法會返回true,否則返回 false

    • <U>Optional<U> map(Function<? super T,? extends U> mapper)        如果有值,則對其執行調用映射函數得到返回值。如果返回值不為 null,則創建包含映射返回值的Optional作為map方法返回值,否則返回空Optional。

    • static <T> Optional<T> of(T value)        返回一個指定非null值的Optional。

    • static <T> Optional<T> ofNullable(T value)       如果為非空,返回 Optional 描述的指定值,否則返回空的 Optional。

    • T orElse(T other)       如果存在該值,返回值, 否則返回 other。

    • T orElseGet(Supplier<? extends T> other)       如果存在該值,返回值, 否則觸發 other,并返回 other 調用的結果。

    • <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)       如果存在該值,返回包含的值,否則拋出由 Supplier 繼承的異常

    •   String toString()     返回一個Optional的非空字符串,用來調試

    到此,關于“Java8新特性Lambda表達式怎么應用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    琼结县| 旺苍县| 阳新县| 久治县| 合肥市| 衢州市| 鹰潭市| 武夷山市| 稷山县| 临洮县| 安远县| 墨江| 荔浦县| 黔西| 正安县| 饶阳县| 兴山县| 聂荣县| 大厂| 突泉县| 吴江市| 临武县| 资阳市| 宁晋县| 林口县| 海宁市| 灵宝市| 兰溪市| 邯郸县| 新绛县| 榕江县| 大悟县| 铁力市| 天峻县| 儋州市| 牡丹江市| 滦平县| 筠连县| 明水县| 泸溪县| 临猗县|