Lambda表达式是Java 8中引入的一个新特性。一个lambda表达式是一个匿名函数,而且这个函数没有名称且不属于任何类。lambda表达式的概念最初是在LISP编程语言中引入的。
Java Lambda表达式语法
要创建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中的方法(或函数)主要有以下部分:
1、名称
2、参数列表
3、函数主体
4、返回类型
Java中的lambda表达式主要有以下部分:
Lambda表达式仅具有主体和参数列表。
1、无名称 - 函数是匿名的所以我们不关心名称
2、参数列表
3、主体 - 这是函数的主要部分
4、无返回类型 - 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
);
}
}
|
注意:
1、正如您所看到的,我们使用lambda表达式只需较少的代码。
2、向后兼容性:您可以将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=