【传智播客郑州校区】Java 8新特性之Lambda表达式入门
文/传智播客郑州校区就业服务部
Lambda表达式是Java 8 的重要更新,也是一个被广大开发者期待已久的新特性。Lambda表达式支持代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数式接口)的实例。
那么Lambda表达式到底是如何书写的呢,我们先来看一下它的语法格式。其实它由三部分组成。
l 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
l 箭头(->)。必须通过英文中画线和大于符号组成。
l 代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么这条语句就不要用花括号表示语句结束。Lambda表达式只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一条省略了return的语句,Lambda表达式会自动返回这条语句的值。
下面我们举例说明Lambda表达式的几种简化写法。
[AppleScript]
纯文本查看
复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
package com.itheima;
public
class
Demo
{
/
/
调用该方法需要Eatable对象
public void eat
(
Eatable e
)
{
System.out.println
(
e
)
;
e.taste
(
)
;
}
/
/
调用该方法需要Flyable对象
public void drive
(
Flyable f
)
{
System.out.println
(
"我正在驾驶:"
+
f
)
;
f.fly
(
"【碧空如洗的晴日】"
)
;
}
/
/
调用该方法需要Addable对象
public void test
(
Addable
add
)
{
System.out.println
(
"5与3的和为:"
+
add
.
add
(
5
,
3
)
)
;
}
public static void
main
(
String[] args
)
{
Demo demo
=
new
Demo
(
)
;
/
/
Lambda表达式的代码块只有一条语句,可以省略花括号。
demo.eat
(
(
)
-
>
System.out.println
(
"苹果的味道不错!"
)
)
;
/
/
Lambda表达式的形参列表只有一个形参,省略圆括号
demo.drive
(
weather
-
>
{
System.out.println
(
"今天天气是:"
+
weather
)
;
System.out.println
(
"直升机飞行平稳"
)
;
}
)
;
/
/
Lambda表达式的代码块只有一条语句,省略花括号
/
/
代码块中只有一条语句,即使该表达式需要返回值,也可以省略
return
关键字。
demo.test
(
(
a
,
b
)
-
>
a
+
b
)
;
}
|
[AppleScript]
纯文本查看
复制代码
1
2
3
4
5
6
7
8
9
|
interface Eatable
{
void taste
(
)
;
}
interface Flyable
{
void fly
(
String weather
)
;
}
interface Addable
{
int
add
(
int a
,
int b
)
;
}
|
上面程序中的第一段粗体字代码使用Lambda表达式相当于不带形参的匿名方法,由于该Lambda表达式的代码只有一行代码,因此可以省略代码块的花括号;第二段粗体字代码使用Lambda表达式相当于只带一个形参的匿名方法,由于该Lambda表达式的形参列表只有一个形参,因此省略了形参列表的圆括号;第三段粗体字代码的Lambda表达式的代码块中只有一行语句,这行语句的返回值将作为该代码块的返回值。
我们发现,以上三段粗体字代码调用的方法分别需要传入Eatable类型参数、Flyable类型参数、Addable参数,但事实上我们传入的仅仅是Lambda表达式,但上面的程序可以正常编译、运行,这说明Lambda表达式实际上将会被当成一个“任意类型”的对象,到底需要当成何种类型的对象,这取决于运行环境的需要,后面我们再详细介绍Lambda表达式被当成何种对象。
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线 地铁一号线梧桐街站A口出