在jdk1.8中新增加了lambda表示式,可能有的小夥伴在github上面學習別人的專案的時候會看到有這樣的符號
-
>
乙個箭頭類似於js中的箭頭函式,很神奇吧,這個就是jdk8中新增的lambda表示式。
有的小夥伴可能會問為什麼我們要使用lambda表示式,lambda表示式採用的是函式式程式設計,無需關心如何實現,並且**非常的簡潔,清晰易懂,下面我們就通過乙個例子來看下傳統方式和使用lambda表示式實現執行緒
傳統的模式使用執行緒
new
thread
(new
runnable()
}).start()
;
用lambda實現執行緒
new
thread((
)->system.out.
println
("ok"))
.start()
;
可以從上面的例子中看到,傳統模式寫的**很多,比較麻煩,而使用lambda來實現,非常的簡單,也非常的清晰,並且是面向函式式的,無須關心它實現了內部的介面。
@functionalinte***ce
inte***ce
intnumber
}public
class
lambdademo;}
}
在上面中我們定義了乙個intnumber的介面,這個介面有1個預設實現saynumber方法,也有乙個jdk8的預設底層實現default add的方法,default 關鍵字在jdk8中新增加的,叫預設的底層實現,而在我們這個案例中,真正的預設實現是saynumber。
(i)
-> i*
2;
括號裡面的i 代表要操作的變數, 其中 i*2代表的是讓i的值 * 2,注意當引數只有乙個的時候,i的括號是可以省略的,當引數在1個以上就要加()。
intnumber i3 =
(int i)
->
;
(int i)是明確了引數的型別是int ,右邊的邏輯被{}包裹起來,這樣就可以在裡面寫具體的業務了。
需要注意如下:
@functionalinte***ce
這個代表的是函式介面,最好在介面上加上這個註解
在lambda中我們可以使用普通變數型別定義,也可以使用陣列,也可以強轉型別實現,如下:
@functionalinte***ce
inte***ce
imath
@functionalinte***ce
inte***ce
imath2
public
class
typedemo
;for
(imath imath : lambdas)
system.out.
println
(lambdas)
;//強轉
object lambda2 =
(imath)
(x,y)
-> x + y;
//通過返回型別
imath createlambda =
createlambda()
; typedemo demo =
newtypedemo()
;//當有二次性的時候使用方法強轉
demo.
test
((imath)
(x, y)
-> x + y);}
public
void
test
(imath math)
public
void
test
(imath2 math)
public
static imath createlambda()
}
上面定義了兩個介面分別是imath 和imath2,並且使用了@functionalinte***ce註解來宣告是乙個函式介面,imath中有乙個add的方法,我們通過imath介面來使用lambda表示式。
imath lambda =
(x,y)
-> x+ y;
system.out.
println
(lambda.
add(1,
3));
在上面我說過當有2個引數及以上的時候就要加括號了,而箭頭的右邊 就是邏輯了,在這裡我們希望 讓x和y的值相加。
imath[
] lambdas =
;
這個是陣列的定義
object lambda2 =
(imath)
(x,y)
-> x + y;
當型別為object的時候,需要進行強轉
imath createlambda =
createlambda()
;public
static imath createlambda()
我們可以接收乙個靜態方法方法這樣使用也是沒有問題的。
typedemo demo =
newtypedemo()
;//當有二次性的時候使用方法強轉
demo.
test
((imath)
(x, y)
-> x + y)
;public
void
test
(imath math)
public
void
test
(imath2 math)
上面定義了2個介面 imath和imath2當我們呼叫的時候會發生報錯這個時候就要明確選擇哪乙個了,然後進行了強轉的操作。
消費者介面
public
class
functiondemo
}
我們使用predicate這個函式介面來使用lambda表示式
predicate
predicate = i -
> i >
0;
我們給了integer的泛型,當引數為乙個的時候可以省略括號,右邊的就是業務邏輯
predicate.
test(10
);
這是乙個斷言函式和assert一樣,返回的是boolean值。
consumer
consumer = s -
> system.out.
println
(s);
consumer是乙個消費者函式,當左邊的引數和右邊要返回引數名稱相同型別相同時候我們可以這樣簡寫如下
system.out:
:println;
consumer.
accept
("消費了資料"
);
accept這個方法只能接受字串。
public
class
currydemo
; function f = functions;
for(
int i =
0; i < nums.length; i++
)else}}
}}
使用function這個函式來使用lambda表示式
function
> t = x -
> y -
> x + y;
可以看到這個function函式接受的是integer型別的引數,返回的是function,然後又巢狀了乙個function,被巢狀的這個function接受引數和返回引數都是integer型別。
這裡注意可以看出規律是乙個高階函式。
lambda非常方便和js中箭頭函式十分相似,左邊代表引數,箭頭的右邊則是邏輯業務**,lambda語法上更加的精煉,幫我們解決很多的問題,lambda還可以結合stream流以及jdk9中的reactive stream一起使用非常的強大。
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...
lambda表示式的使用
package com.zhoufu.springboot02config.pojo public class demolambda 2.本類的方法 public void pringtext string text,printer printer public static void main s...
Lambda表示式的使用
說到jdk8新特性那就少不了lambda表示式,lambda表示式可以代替大部分的匿名內部類,優化我們的 結構。之前只是簡單的了解過lambda表示式,現將其總結如下。使用前提 使用lambda必須要有介面,並且要求介面中有且僅有乙個抽象方法。只包含乙個抽象方法的介面稱為函式式介面。function...