0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

Java8的新特性

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-10-10 17:12 ? 次閱讀

雖然目前Java最新版本都已經(jīng)到16了,但是絕大部分公司目前用的Java版本都是8,想當初Java8問世后,其Lambda表達式與方法引用可是最亮眼的新特性,目前,這兩個特性也被大家廣泛使用,所以今天指北君就帶大家看看這兩個特性

1.Lambda

從JDK1.8開始為了簡化使用者進行代碼開發(fā),專門提供有Lambda表達式的支持,利用此操作形式可以實現(xiàn)函數(shù)式的編程,對于函數(shù)式編程比較著名的語言:haskell,Scala,利用函數(shù)式的編程可以避免掉面向?qū)ο缶幊讨械囊恍┓爆嵉膯栴}。面向?qū)ο笤谄溟L期發(fā)展的過程中一直有一部分的反對者認為面向?qū)ο筮^于繁瑣

比如:

public interface IMessage {
    public void send(String str);
}
public class Demo {
    public static void  main(String args[]){
        IMessage msg = new IMessage() {
            @Override
            public void send(String str) {
                System.out.println("消息發(fā)送:"+str);
            }
        };
        msg.send("hahahaha");
    }
}

上面語句的核心功能只有一行核心語句,但是為了這一行核心語句依然需要按照完整的面向?qū)ο蠼o出的設計結(jié)構進行開發(fā)。所以Lambda出現(xiàn)啦。

public interface IMessage {
    public void send(String str);
}
public class Demo {
    public static void  main(String args[]){
       IMessage msg = (str)- >{
           System.out.println("發(fā)送消息:"+str);
       };
        msg.send("hahahaha");
    }
}

簡單吧,這種形式就避免了復雜的面向?qū)ο蠼Y(jié)構化的要求。

Lambda表達式如果要想使用,那么必須有一個重要的實現(xiàn)要求:SAM(Single Abstract Method)只有一個抽象方法( 但可以有default和static方法 ),以IMessage接口為例,在這個接口里面發(fā)現(xiàn)只是提供有一個send()方法,除此之外沒有任何其他方法定義,所以這樣的接口就被稱為 函數(shù)式接口 ,而只有函數(shù)式接口才可以被Lambda表達式所使用

jdk1.8之后可以在接口里面定義static方法和default方法也是為了函數(shù)式編程而設置的,如下面這個是允許的

public interface IMessage {
    public void send(String str);
    public default void defaultMethod(){
        System.out.println("hahahaha");
    };

}
public class Demo {
    public static void  main(String args[]){
       IMessage msg = (str)- >{
           System.out.println("發(fā)送消息:"+str);
       };
        msg.send("hahahaha");
        msg.defaultMethod();
    }
}

對于Lambda表達式而言,提供了如下幾種格式

1) 方法沒有參數(shù):()-->{ };

2) 方法有參數(shù):(參數(shù),參數(shù))-->{ };

  1. 如果現(xiàn)在只有一行語句返回:(參數(shù),參數(shù))-->語句;

我們看下第三種

public interface IMath {
    public int add(int x,int y);
}
public class Demo {
    public static void  main(String args[]){
       IMath math = (t1,t2) - > t1 + t2;
        System.out.println(math.add(10,20));
    }
}

利用Lambda表達式可以使代碼更加簡便

其中一個很經(jīng)典的應用就是多線程Runnable接口的例子

public class Test{
    public static void main(String[] args) {
        /*
        匿名內(nèi)部類的方式
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("nihao");
            }
        }).start();
        System.out.println("你好");
        
        */
        
        
        //lambda的方式
        new Thread(()- > {
            for(int i = 1 ; i< 100 ; i++){
                System.out.println("It is a lambda function!");
            }

        }).start();

    }
}

2.方法引用

引用數(shù)據(jù)類型最大的特點是可以進行內(nèi)存的指向處理,但是在傳統(tǒng)的開發(fā)之中一直所使用的只是對象引用操作,而jdk1.8以后也提供有方法的引用,即:不同的方法名稱可以描述同一個方法(即可以為一個方法定義多個名字,但是要求必須是函數(shù)式接口)。如果要進行方法的引用在java里面提供了如下的四種形式

1)引用靜態(tài)方法:類名稱 :: static方法名稱;

2)引用某個實例對象的方法:實例化對象 :: 普通方法;

3)引用特定類型的方法:特定類 :: 普通方法;

4)引用構造方法:類名稱 :: new ;

2.1 引用靜態(tài)方法

在String類里面提供有String.valueOf( )方法,這個方法就屬于靜態(tài)方法。

方法范例:public static String valueOf(int i),該方法有參數(shù)還有返回值

@FunctionalInterface  //函數(shù)式接口
public interface IFunction< P,R > {
    public R change(P p);      //p描述的是參數(shù),R描述的是返回值
}
public class Demo {
    public static void  main(String args[]){

        IFunction< Integer , String > fun = String :: valueOf;
        String str = fun.change(100);
        System.out.println(str.length());
    }
}

輸出結(jié)果為:3

2.2 引用某個實例對象的方法

String類里面有個轉(zhuǎn)大寫的方法:public String toUpperCase( )

這個方法是必須在有實例化對象提供的情況下才可以調(diào)用

@FunctionalInterface  //函數(shù)式接口
public interface IFunction< R > {
    public R upper();
}
public class Demo {
    public static void  main(String args[]){

        IFunction< String > fun = "hahaha" :: toUpperCase;    //"hahaha"為String的實例化對象
        System.out.println(fun.upper());
    }
}

輸出結(jié)果為:hahaha

2.3 引用特定類型的方法

在方法引用時也可以引用特定類中的一些操作方法,在String里面提供有一個字符串大小關系的比較

比較大?。簆ublic int compareTo(String anotherString)

這是一個普通方法,如果要引用普通方法,則往往都需要實例化對象,但是如果說現(xiàn)在你不想給出實例化對象,只是想引用這個方法,則就可以使用特定類來進行引用處理。

@FunctionalInterface  //函數(shù)式接口
public interface IFunction< P > {
    public int compare(P p1,P p2);
}
public class Demo {
    public static void  main(String args[]){

        IFunction< String > fun = String :: compareTo ;    //String類中的conpareTo方法
        System.out.println(fun.compare("A","a"));
    }
}

輸出結(jié)果為:-34

2.4 引用構造方法

public class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
    public String toString(){
        return "姓名:" + this.name + "、年級:" + this.age ;
    }
}
@FunctionalInterface  //函數(shù)式接口
public interface IFunction< R > {
    public R create(String s ,int a);
}
public class Demo {
    public static void  main(String args[]){

        IFunction< Person > fun = Person :: new ;    //String類中的conpareTo方法
        System.out.println(fun.create("張三",20));
    }
}

輸出結(jié)果:姓名:張三、年級:20

提供方法引用的概念更多情況下也只是彌補了對于引用的支持功能。

3 小結(jié)

本文介紹了Java8的新特性,lambda和方法引用,其為我們編程帶來了便利,所以我們應該需要掌握它。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2970

    瀏覽量

    104814
  • 編程
    +關注

    關注

    88

    文章

    3619

    瀏覽量

    93782
  • 函數(shù)
    +關注

    關注

    3

    文章

    4333

    瀏覽量

    62700
  • Lambda
    +關注

    關注

    0

    文章

    29

    瀏覽量

    9889
收藏 人收藏

    評論

    相關推薦

    LocalDateTime、LocalDate、Date之間相互轉(zhuǎn)換

    LocalDateTime 及 LocalDate 是 Java8 的新特性,有時為了兼容 Date 類型需要進行轉(zhuǎn)換。LocalDateTime 轉(zhuǎn) LocalDate直接調(diào)用
    發(fā)表于 11-04 07:24

    Java語言的特性介紹

      Java語言的作者們編寫了具有廣泛影響的Java白皮書,里面詳細地介紹了他們的設計目標以及實現(xiàn)成果,還用簡短的篇幅介紹了Java語言的特性。下面將對這些
    發(fā)表于 01-20 14:44

    java8特性

    java8為接口聲明添加非抽象方法的實現(xiàn),也成為拓展方法。
    發(fā)表于 11-27 15:54 ?1744次閱讀

    Java并行流存在的問題及解決辦法詳解

    對于從事Java開發(fā)的童鞋來說,相信對于Java8的并行流并不陌生,沒錯,我們常常用它來執(zhí)行并行任務,但是由于并行流(parallel stream)采用的是享線程池,可能會對我們的性能造成嚴重影響,那怎么處理呢?
    發(fā)表于 04-03 15:55 ?12次下載

    Java11GC 性能基準測試報告 Java8Java11對比測試

    當前使用量最大的 Java 版本是 8,所以測試者用 Java 8Java 11 進行對比測試。GC 是影響
    發(fā)表于 02-01 01:46 ?3631次閱讀

    Java語言有哪些特性

    Java語言的作者們編寫了具有廣泛影響的Java白皮書,里面詳細地介紹了他們的設計目標以及實現(xiàn)成果,還用簡短的篇幅介紹了Java語言的特性。下面將對這些
    的頭像 發(fā)表于 05-01 16:08 ?2997次閱讀

    如何利用Stream API來優(yōu)化Java代碼

    使用Stream API優(yōu)化代碼 Java8的新特性主要是Lambda表達式和流,當流和Lambda表達式結(jié)合起來一起使用時,因為流申明式處理數(shù)據(jù)集合的特點,可以讓代碼變得簡潔易讀 放大招,流
    的頭像 發(fā)表于 07-26 14:30 ?1304次閱讀

    JAVA8提供了Optional類來優(yōu)化這種寫法

    這種寫法是比較丑陋的,為了避免上述丑陋的寫法,讓丑陋的設計變得優(yōu)雅。JAVA8提供了Optional類來優(yōu)化這種寫法,接下來的正文部分進行詳細說明
    的頭像 發(fā)表于 04-24 15:18 ?1093次閱讀

    認識Optional并使用

    的問題之一,那么我們今天就要盡可能的利用Java8的新特性 Optional來盡量簡化代碼同時高效處理NPE(Null Pointer Exception 空指針異常)。
    的頭像 發(fā)表于 09-05 14:18 ?765次閱讀

    SpringBoot正式棄用Java8 Java17將成為未來主流版本

    Java基線從 Java 8 提升到了 Java 17 從Java EE APIs 到 Jakarta EE 這個支持被移除 依賴升級 未來
    的頭像 發(fā)表于 10-09 18:03 ?3633次閱讀

    怎么使用Java8的Stream API比較兩個List的差異呢?

    可以使用Java8的Stream API來比較兩個List的差異,并取出不同的對象。
    的頭像 發(fā)表于 08-12 11:15 ?2243次閱讀

    Java8的Stream流 map() 方法

    前言 在日常的開發(fā)工作中經(jīng)常碰到要處理 List 中數(shù)據(jù)的問題,比如從一個對象集合中獲得對象中的一個屬性的集合。之前我們想到的是遍歷每個元素,然后取出來放到另外一個集合中,比較繁瑣;在 Java8
    的頭像 發(fā)表于 09-25 11:06 ?1902次閱讀
    <b class='flag-5'>Java8</b>的Stream流 map() 方法

    為什么需要Streams?它們能取代Java中的for循環(huán)嗎?

    Java8的發(fā)布是Java歷史上的一個重大時刻。Streams 和 Lambda 被引入,它們現(xiàn)在被廣泛使用。
    的頭像 發(fā)表于 11-03 09:39 ?741次閱讀
    為什么需要Streams?它們能取代<b class='flag-5'>Java</b>中的for循環(huán)嗎?

    簡單了解Java的新特性

    Java 8Java 20,Java 已經(jīng)走過了漫長的道路,自 Java 8 以來,
    的頭像 發(fā)表于 11-23 16:38 ?1268次閱讀
    簡單了解<b class='flag-5'>Java</b>的新<b class='flag-5'>特性</b>