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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

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

Java8的新特性

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

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

1.Lambda

從JDK1.8開始為了簡(jiǎn)化使用者進(jìn)行代碼開發(fā),專門提供有Lambda表達(dá)式的支持,利用此操作形式可以實(shí)現(xiàn)函數(shù)式的編程,對(duì)于函數(shù)式編程比較著名的語言:haskell,Scala,利用函數(shù)式的編程可以避免掉面向?qū)ο缶幊讨械囊恍┓爆嵉膯栴}。面向?qū)ο笤谄溟L(zhǎng)期發(fā)展的過程中一直有一部分的反對(duì)者認(rèn)為面向?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出的設(shè)計(jì)結(jié)構(gòu)進(jìn)行開發(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");
    }
}

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

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

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

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

對(duì)于Lambda表達(dá)式而言,提供了如下幾種格式

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表達(dá)式可以使代碼更加簡(jiǎn)便

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

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

2)引用某個(gè)實(shí)例對(duì)象的方法:實(shí)例化對(duì)象 :: 普通方法;

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

4)引用構(gòu)造方法:類名稱 :: new ;

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

在String類里面提供有String.valueOf( )方法,這個(gè)方法就屬于靜態(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 引用某個(gè)實(shí)例對(duì)象的方法

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

這個(gè)方法是必須在有實(shí)例化對(duì)象提供的情況下才可以調(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的實(shí)例化對(duì)象
        System.out.println(fun.upper());
    }
}

輸出結(jié)果為:hahaha

2.3 引用特定類型的方法

在方法引用時(shí)也可以引用特定類中的一些操作方法,在String里面提供有一個(gè)字符串大小關(guān)系的比較

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

這是一個(gè)普通方法,如果要引用普通方法,則往往都需要實(shí)例化對(duì)象,但是如果說現(xiàn)在你不想給出實(shí)例化對(duì)象,只是想引用這個(gè)方法,則就可以使用特定類來進(jì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 引用構(gòu)造方法

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 + "、年級(jí):" + 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é)果:姓名:張三、年級(jí):20

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

3 小結(jié)

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

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

    關(guān)注

    19

    文章

    2946

    瀏覽量

    104370
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3544

    瀏覽量

    93470
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62230
  • Lambda
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    9847
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    Java語言的特性介紹

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

    java8特性

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

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

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

    Java11GC 性能基準(zhǔn)測(cè)試報(bào)告 Java8Java11對(duì)比測(cè)試

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

    Java語言有哪些特性

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

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

    使用Stream API優(yōu)化代碼 Java8的新特性主要是Lambda表達(dá)式和流,當(dāng)流和Lambda表達(dá)式結(jié)合起來一起使用時(shí),因?yàn)榱魃昝魇教幚頂?shù)據(jù)集合的特點(diǎn),可以讓代碼變得簡(jiǎn)潔易讀 放大招,流
    的頭像 發(fā)表于 07-26 14:30 ?1254次閱讀

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

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

    認(rèn)識(shí)Optional并使用

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

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

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

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

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

    Java8的Stream流 map() 方法

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

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

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

    簡(jiǎn)單了解Java的新特性

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