Lambda表達式是Java 8中引入的一個新特性。一個lambda表達式是一個匿名函數,並且這個函數沒有名稱且不屬於任何類。lambda表達式的概念最初是在LISP編程語言中引入的。java
Java Lambda表達式語法express
要建立lambda表達式,咱們須要在lambda運算符(->)的左側指定輸入參數(若是有的話),並將表達式或語句塊放在lambda運算符的右側。例如,lambda表達式(x,y)->x + y 表示lambda表達式採用兩個參數x和y並返回兩個參數的總和。編程
1
2
|
//Syntax of lambda expression
(parameter_list) -> {function_body}
|
Lambda表達式 vs Java中的方法編程語言
Java中的方法(或函數)主要有如下部分:函數
一、名稱post
二、參數列表spa
三、函數主體code
四、返回類型orm
Java中的lambda表達式主要有如下部分:接口
Lambda表達式僅具備主體和參數列表。
一、無名稱 - 函數是匿名的因此咱們不關心名稱
二、參數列表
三、主體 - 這是函數的主要部分
四、無返回類型 - java 8編譯器可以經過檢查代碼來推斷返回類型,因此使用者無需明確指定
在Java中使用Lambda表達式的位置
要使用lambda表達式,您須要建立本身的功能接口或使用Java提供的預約義功能接口。功能性接口(或單一抽象方法接口)是指帶有單一抽象方法的接口,例如:可運行接口、可調用接口、動做監聽者等等。
使用函數接口:
Java 8以前:咱們建立匿名內部類。
Java 8以後:您能夠使用lambda表達式代替匿名內部類。
Java Lambda表達式實例
不使用Lambda表達式:在Java 8以前,咱們使用匿名內部類來實現功能接口的惟一抽象方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import
java.awt.*;
import
java.awt.event.*;
public
class
ButtonListenerOldWay {
public
static
void
main(String[] args) {
Frame frame=
new
Frame(
"ActionListener Before Java8"
);
Button b=
new
Button(
"Click Here"
);
b.setBounds(
50
,
100
,
80
,
50
);
b.addActionListener(
new
ActionListener(){
public
void
actionPerformed(ActionEvent e){
System.out.println(
"Hello World!"
);
}
});
frame.add(b);
frame.setSize(
200
,
200
);
frame.setLayout(
null
);
frame.setVisible(
true
);
}
}
|
Lambda使用表達式方式:咱們能夠像這樣建立一個lambda表達式,而不是建立匿名內部類:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import
java.awt.*;
public
class
ButtonListenerNewWay {
public
static
void
main(String[] args) {
Frame frame=
new
Frame(
"ActionListener java8"
);
Button b=
new
Button(
"Click Here"
);
b.setBounds(
50
,
100
,
80
,
50
);
b.addActionListener(e -> System.out.println(
"Hello World!"
));
frame.add(b);
frame.setSize(
200
,
200
);
frame.setLayout(
null
);
frame.setVisible(
true
);
}
}
|
注意:
一、正如您所看到的,咱們使用lambda表達式只需較少的代碼。
二、向後兼容性:您能夠將lambda表達式與舊代碼一塊兒使用,Lambdas是向後兼容的,所以當您將項目遷移到Java 8時,能夠在現有API中使用它們。
讓咱們看幾個Lambda表達式的例子。
示例1:沒有參數的Java Lambda表達式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@FunctionalInterface
interface
MyFunctionalInterface {
//A method with no parameter
public
String sayHello();
}
public
class
Example {
public
static
void
main(String args[]) {
// lambda expression
MyFunctionalInterface msg = () -> {
return
"Hello"
;
};
System.out.println(msg.sayHello());
}
}
|
輸出:
1
|
Hello
|
示例2:具備單個參數的Java Lambda表達式
1
2
3
4
5
6
7
8
9
10
11
12
|
@FunctionalInterface
interface
MyFunctionalInterface {
//A method with single parameter
public
int
incrementByFive(
int
a);
}
public
class
Example {
public
static
void
main(String args[]) {
// lambda expression with single parameter num
MyFunctionalInterface f = (num) -> num+
5
;
System.out.println(f.incrementByFive(
22
));
}
}
|
輸出:
1
|
|
示例3:具備多個參數的Java Lambda表達式
1
2
3
4
5
6
7
8
9
10
|
interface
StringConcat {
public
String sconcat(String a, String b);
}
public
class
Example {
public
static
void
main(String args[]) {
// lambda expression with multiple arguments
StringConcat s = (str1, str2) -> str1 + str2;
System.out.println(
"Result: "
+s.sconcat(
"Hello "
,
"World"
));
}
}
|
輸出:
1
|
Result:Hello World
|
示例4:使用foreach循環迭代集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import
java.util.*;
public
class
Example{
public
static
void
main(String[] args) {
List<String> list=
new
ArrayList<String>();
list.add(
"Rick"
);
list.add(
"Negan"
);
list.add(
"Daryl"
);
list.add(
"Glenn"
);
list.add(
"Carl"
);
list.forEach(
// lambda expression
(names)->System.out.println(names)
);
}
}
|
咱們能夠使用lambda表達式迭代Maps和其餘集合類,請參閱本指南:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=36&cid=