VectorLu

New To Java 8 Lambda 表达式

Java 8 中加入了 Lambda 表达式。

组成及写法

组成:

  1. 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
  2. 箭头 ->
  3. 代码块。

几种写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
interface Eatable {
void taste();
}
interface Flyalbe {
void fly(String weather);
}
interface Multipliable {
int multiply(int a, int b);
}
public class LambdasShow {
public void eat(Eatable e) {
System.out.println(e);
e.taste();
}
public void fly(Flyalbe f) {
System.out.println("I'm flying: " + f);
f.fly("[sunny]");
}
public void multiply(Multipliable multi) {
System.out.println("5 x 3 = " + multi.multiply(5, 3));
}
public static void main(String[] args) {
LambdasShow ls = new LambdasShow();
// Lambda 表达式的代码块只有一条语句,可以省略花括号。
ls.eat(()-> System.out.println("This apple tastes good!"));
// Lambda 表达式的形参列表只有一个形参,省略圆括号
ls.fly(weather -> {
System.out.println("It is " + weather + " today.");
System.out.println("The helicopter condition is good");
});
// Lambda 表达式的代码块只有一条语句,省略花括号
// 代码块中只有一条语句,即使该表达式需要返回值,也可以省略 return
ls.multiply((a, b)->a * b);
}
}

函数式接口

Lambda 表达式有如下两个限制:

  1. Lambda 表达式的目标类型必须是明确的函数式接口。
  2. Lambda 表达式只能为函数式接口创建对象。Lambda 表达式只能实现一个方法,因此它只能为只有一个抽象方法的函数式接口创建对象。

Lambda 表达式的目标类型完全可能是变化的——唯一的要求是,Lambda 表达式实现的匿名方法与目标类型(函数式接口)中惟一的抽象方法有相同的形参列表。

Java 8 在 java.util.function 包下预定义了大量函数式接口,典型地包含如下 4 种接口:

  1. XxxFunction 通常包含一个 apply() 抽象方法,该方法通常用于对指定数据进行转换处理。
  2. XxxConsumer 通常包含一个 accept() 抽象方法,与上一个的作用基本相似,只是该方法不会返回处理结果。
  3. XxxxPredicate 通常包含一个 test() 抽象方法,该方法通常用来对参数进行某种判断,然后返回一个 boolean 值。通常用于筛数据。
  4. XxxSupplier 这类接口中通常包含一个 getAsXxx() 抽象方法,该方法不需要输入参数,该方法会按某种逻辑算法返回一个数据。

方法引用与构造器引用

如果 Lambda 表达式的代码块只有一条代码,还可以在代码块中使用方法引用和构造器引用。

TODO:

引用类方法

参考

《疯狂 Java 讲义》第三版
《Java 8 函数式编程》

您的支持将鼓励我继续创作!

热评文章