淺析Java8新特性Lambda表達(dá)式和函數(shù)式接口
什么是Lambda表達(dá)式,java8為什么使用Lambda表達(dá)式?
“Lambda 表達(dá)式”(lambda expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名,直接對(duì)應(yīng)于其中的lambda抽象(lambda abstraction),是一個(gè)匿名函數(shù),即沒有函數(shù)名的函數(shù)。我們可以把 Lambda表達(dá)式理解為是 一段可以傳遞的代碼。最直觀的是使用Lambda表達(dá)式之后不用再寫大量的匿名內(nèi)部類,簡化代碼,提高了代碼的可讀性。
// 啟動(dòng)一個(gè)線程,不使用Lambda表達(dá)式 new Thread(new Runnable() { @Override public void run() { System.out.println("啟動(dòng)一個(gè)線程"); } }).start(); //使用Lambda表達(dá)式,只需要一行代碼 new Thread(() -> System.out.println("啟動(dòng)一個(gè)線程")).start();
Lambda表達(dá)式的基本語法和格式
基本語法
- java8中引入了新的操作符”->”,稱為箭頭操作符或者lambda操作符,箭頭操作符將lambda拆分為兩部分,左側(cè):lambda表達(dá)式的參數(shù)列表,右側(cè):lambda表達(dá)式中的所需要執(zhí)行的的功能(接口實(shí)現(xiàn)的功能代碼)。
- lambda表達(dá)式需要“函數(shù)式接口”的支持,接口中只有一個(gè)抽象方法的接口稱為函數(shù)式接口,可以使用注解@FunctionalInterface檢查接口是否是函數(shù)式接口。
- lambda表達(dá)式的參數(shù)列表的數(shù)據(jù)類型可以省略不寫,因?yàn)閖vm編輯器可以通過上下文判斷。
- 基本格式
① 無參數(shù),無返回值。( ) -> System.out.println(“hello”)
// 實(shí)現(xiàn)Runnable接口(無參,無返回) Runnable r = () -> System.out.println("hello lambda");
② 一個(gè)參數(shù)(小括號(hào)可以省略不寫,習(xí)慣上加上小括號(hào)),無返回值。(x) -> System.out.println(x)
//Consumer接口(一個(gè)參數(shù),無返回值),之后會(huì)提到 //第一種,小括號(hào)不省略 Consumer<String> c = (x) -> System.out.print(x); c.accept("hello"); //小括號(hào)省略 Consumer<String> c1 = x -> System.out.print(x); c1.accept("hello")
③ 有多個(gè)參數(shù),并且lambda有多條語句,則lambda語句必須用大括號(hào)括起來并有return返回(若有一條語句則可以省略大括號(hào)和return),有返回值。(x,y) ->{System.out.println(“hello”);return Integer.compare(x, y);};
//Comparator接口 //多條語句 Comparator<Integer> comparator = (x,y) ->{ System.out.println("hello"); return Integer.compare(x, y); }; //一條語句 Comparator<Integer> comparator2 = (x,y) -> Integer.compare(x, y); System.out.println(comparator2.compare(23, 22));
還有其他的一些格式都是大同小異,這里就不再了解。
函數(shù)式接口是什么?
在前面也提到了函數(shù)接口,那么函數(shù)接口到底是什么呢?是個(gè)接口,只包含一個(gè)抽象方法,那么它就是函數(shù)式接口,我們可以在任意函數(shù)式接口上使用 @FunctionalInterface 檢查它是否是一個(gè)函數(shù)式接口。
函數(shù)式接口里是可以包含默認(rèn)方法、靜態(tài)方法,他們不是抽象方法;也可以包含Java.lang.Object里的public方法,因?yàn)槿魏我粋€(gè)類都繼承Object類,包含了來自java.lang.Object里對(duì)這些抽象方法的實(shí)現(xiàn),也不屬于抽象方法;函數(shù)式接口里允許子接口繼承多個(gè)父接口,但每個(gè)父接口中都只能存在一個(gè)抽象方法,且必須的相同的抽象方法。
Java8內(nèi)置函數(shù)式接口
四大核心函數(shù)式接口
函數(shù)式接口 | 方法 | 參數(shù)類型 | 返回類型 | 作用 |
---|---|---|---|---|
Consumer<T> 消費(fèi)型接口 | void accept(T t) | T | void | 對(duì)T類型的參數(shù)進(jìn)行操作 |
Supplier<T> 供給型接口 | T get() | 無 | T | 操作數(shù)據(jù),返回T類型的結(jié)果 |
Function<T, R> 函數(shù)型接口 | R apply(T t) | T | R | 對(duì)T類型參數(shù)進(jìn)行操作,并返回R類型的結(jié)果 |
Predicate<T> 斷定型接口 | boolean test(T t) | T | boolean | 確定T類型參數(shù)是否滿足某約束,并返回boolean值 |
//Consumer<T> 消費(fèi)型接口 @Test public void test1(){ Consumer<String> c = (x) -> System.out.println("hello:"+x+"!"); c.accept("Java"); } // Supplier<T> 供給型接口 @Test public void test2(){ Supplier<String> s = () -> "hello,beautiful girl"; String str = s.get(); System.out.println(str); } //Function<T,R> 函數(shù)性接口 @Test public void test3(){ Function<String, Integer> f= (x) -> x.length(); Integer len = f.apply("hello"); System.out.println(len); } //Predicate<T> 斷言型接口 @Test public void test4(){ Predicate<String> p = (x) -> x.length()>5; boolean b = p.test("hello Java"); System.out.println(b); }
其它函數(shù)式接口
函數(shù)式接口 | 方法 | 參數(shù)類型 | 返回類型 | 作用 |
---|---|---|---|---|
BiFunction<T , U, R > | R apply(T t, U u) | T, U | R | 對(duì) T, U 類型的參數(shù)進(jìn)行操作,并返回R類型的結(jié)果 |
UnaryOperator<T> (Function 子接口) | T apply(T t) | T | T | 對(duì) T類型的參數(shù)進(jìn)行一元運(yùn)算,并返回R對(duì)象的結(jié)果 |
BinaryOperato<T,R> (BiFunction 子接口) ) | T apply(T t1, T t2 | T, T | T | 對(duì)T類型的參數(shù)進(jìn)行二元運(yùn)算,并返回T類型的結(jié)果 |
BiConsumer<T, U> | void accept(T t, U u) | T, U | void | 對(duì)T,作 |
ToIntToIntFunction<T> ToLongFunction<T> ToDoubleFunction<T> | int(long,double) applyAsInt(T value) | T | int, long, double | 計(jì) 算 int 、 long 、double值的函數(shù) |
IntFunction<R> LongFunction<R> DoubleFunction<R> | R apply(int(long,double) value) | int, long, double | R | 參數(shù)分別為int、long、double 類型的函數(shù) |
總結(jié)
以上所述是小編給大家介紹的Java8新特性Lambda表達(dá)式和函數(shù)式接口,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
詳解java解決分布式環(huán)境中高并發(fā)環(huán)境下數(shù)據(jù)插入重復(fù)問題
這篇文章主要介紹了java解決并發(fā)數(shù)據(jù)重復(fù)問題 ,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03java線程池ThreadPoolExecutor類使用小結(jié)
這篇文章主要介紹了java線程池ThreadPoolExecutor類使用,本文主要對(duì)ThreadPoolExecutor的使用方法進(jìn)行一個(gè)詳細(xì)的概述,示例代碼介紹了ThreadPoolExecutor的構(gòu)造函數(shù)的相關(guān)知識(shí),感興趣的朋友一起看看吧2022-03-03Java class文件格式之?dāng)?shù)據(jù)類型_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java class文件格式之?dāng)?shù)據(jù)類型的相關(guān)資料,需要的朋友可以參考下2017-06-06Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(46)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-08-08java發(fā)送kafka事務(wù)消息的實(shí)現(xiàn)方法
本文主要介紹了java發(fā)送kafka事務(wù)消息的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07圖文詳解mybatis+postgresql平臺(tái)搭建步驟
從頭開始搭建一個(gè)mybatis+postgresql平臺(tái),這篇文章主要介紹了圖文詳解mybatis+postgresql平臺(tái)搭建步驟,感興趣的小伙伴們可以參考一下2016-07-07