日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface

發(fā)布時間:2024/4/14 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Jdk1.8新增lambda表達式是為了簡化代碼,主要用于簡化匿名實現(xiàn)類,為其提供一種更加簡潔的寫法。Lambda表達式在swift語言中被稱為代碼塊,lambda表達式可以認(rèn)為是一種特殊的接口,是匿名實現(xiàn)類的簡寫,該接口必須只有一個抽象方法。

作用:
1)簡化匿名實現(xiàn)類的書寫,實現(xiàn)接口抽象方法;
2)作為函數(shù)中的參數(shù)來傳遞;

語法結(jié)構(gòu):

(參數(shù)類型 參數(shù)名1,參數(shù)類型 參數(shù)名2,……參數(shù)類型 參數(shù)名n)->{//方法體 }

1)()中的內(nèi)容就是方法中的參數(shù)列表,包括參數(shù)類型、參數(shù)名,其中的參數(shù)類型可以忽略,當(dāng)參數(shù)個數(shù)只有一個時也可以忽略掉小括號;
2){}中的內(nèi)容是方法中的方法體,當(dāng)方法體中只有一行代碼時可忽略掉{},當(dāng)方法體中只有一行代碼并且需要返回值時也可以忽略掉return;

示例1:lambda表達式代替實現(xiàn)類

定義一個IGreeting接口,有三個方法:
1)無入?yún)⑷绶祷刂档姆椒?br /> 2)一個入?yún)⒁粋€返回值的方法
3)兩個入?yún)⒁粋€返回值的方法

package com.example.jdknewuse;/*** @author: liumengbing* @date: 2019/02/18 11:10**/ public class GreetingTest {public static void main(String[] args){/*** 無入?yún)o返回值的接口實現(xiàn)**///1、匿名內(nèi)部類實現(xiàn)new IGreeting(){@Overridepublic void sayHello() {System.out.println("Greeting everyone");}}.sayHello();//2、lambda表達式實現(xiàn)IGreeting greeting = ()->{System.out.println("Greeting everyone");};greeting.sayHello();//3、可簡寫為IGreeting greeting1 = ()->System.out.println("Greeting everyone");greeting.sayHello();/*** 一個入?yún)⒁粋€返回值的接口實現(xiàn)*///1、匿名內(nèi)部類實現(xiàn)new IGreeting(){@Overridepublic String sayHello(String name) {return name + "Greeting everyone";}}.sayHello("lmb");//2、lambda表達式實現(xiàn)IGreeting greeting2 = (String name)->{return name + "Greeting everyone";};greeting2.sayHello("lmb");//可簡化為IGreeting greeting3 = name -> name + "Greeting everyone";greeting3.sayHello("lmb");/*** 兩個入?yún)⒁粋€返回值的接口實現(xiàn)*///1、匿名內(nèi)部類實現(xiàn)new IGreeting(){@Overridepublic String sayHello(String name, String greetingMessage) {return name + greetingMessage;}}.sayHello("lmb","Greeting everyone");//2、lambda表達式實現(xiàn)IGreeting greeting4 = (String name, String greetingMessage)->{return name + greetingMessage;};greeting4.sayHello("lmb","Greeting everyone");//可簡化為IGreeting greeting5 = (name,greetingMessage) -> name + greetingMessage;greeting5.sayHello("lmb","Greeting everyone");} }

上面的示例只定義了接口,沒有定義實現(xiàn)類,通過lambda表達式代替了實現(xiàn)類;

注意:以上代碼為了方便查看將三個方法寫到了一個接口中,但是實際上lambda接口只能有一個抽象方法,但是可以同時擁有多個靜態(tài)方法和默認(rèn)方法

示例2:lambda表達式傳遞參數(shù)

定義一個只有一個抽象方法的接口:


函數(shù)式接口

通過上面的示例了解了lambda表達式,lambda表達式其實就是函數(shù)式接口。所謂函數(shù)式接口,首先是一個接口,然后就是這個接口里面只能有一個抽象方法。這種類型的接口也稱作SAM接口(Single Abstract Method Interface)。

函數(shù)式接口主要用在lambda表達式和方法引用(實際上也可認(rèn)為是lambda表達式)上。

@FunctionalInterface注釋

Java8為函數(shù)式接口引入了一個新的注解@FunctionalInterface,主要用于編譯級錯誤檢查。加上該注解,當(dāng)你寫的接口不符合函數(shù)式接口定義的時候,接口會報錯。

注意:

1)加不加@FunctionalInterface對于接口是不是函數(shù)式接口沒有影響,該注解只是提醒編譯器去檢查該接口是都僅包含一個抽象方法。
2)函數(shù)式接口里面允許定義默認(rèn)方法和靜態(tài)方法。因為默認(rèn)方法和靜態(tài)方法不是抽象方法,符合函數(shù)式接口的定義。
3)函數(shù)式接口里面允許定義java.lang.object里的public方法。這些方法對于函數(shù)式接口來說,不被當(dāng)成抽象方法(雖然它們是抽象方法)。因為任何一個函數(shù)式接口的實現(xiàn),默認(rèn)都繼承了object類,已經(jīng)包含了對這些抽象方法的實現(xiàn)。

Jdk中的函數(shù)式接口:

java.lang.Runnable,
java.awt.event.ActionListener,
java.util.Comparator,
java.util.concurrent.Callable
java.util.function包下的接口,如Consumer、Predicate、Supplier等

總結(jié)

以上是生活随笔為你收集整理的Jdk1.8新特性(二)——lambda表达式(参数列表)-{}和函数式接口@FunctionalInterface的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。