1、Lambda表达式
把“一块代码”赋给了一个变量。而“这块代码”,或者说“这个被赋给一个变量的函数”,就是一个Lambda表达式。
但是这里仍然有一个问题,就是变量aBlockOfCode的类型应该是什么?
在Java 8里面,所有的Lambda的类型都是一个接口,而Lambda表达式本身,也就是”那段代码“,需要是这个接口的实现。这是我认为理解Lambda的一个关键所在,简而言之就是,Lambda表达式本身就是一个接口的实现。
lambda 表达式的语法格式如下:
(parameters) -> expression
或
(parameters) ->{ statements; }
简单示例
Lambda 表达式的简单例子:
// 1. 不需要参数,返回值为 5
() -> 5
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的差值
(x, y) -> x – y
// 4. 接收2个int型整数,返回他们的和
(int x, int y) -> x + y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何
注意事项
使用 Lambda 表达式需要注意以下两点:
Lambda 表达式主要用来定义行内执行的方法类型接口(例如,一个简单方法接口)。在上面例子中,我们使用各种类型的 Lambda 表达式来定义 MathOperation 接口的方法,然后我们定义了 operation 的执行。
Lambda 表达式免去了使用匿名方法的麻烦,并且给予 Java 简单但是强大的函数化的编程能力。
在这个 Lambda 表达式中,“it” 是一个隐式参数,代表函数所接收的单个参数。在 Java 中,当 Lambda 表达式只有一个参数时,可以使用 “it” 来代替它,从而简化代码。在你提供的例子中,“.map(it -> it.multiply())” 中的 “it” 表示 map()
方法所接收的单个参数。
具体来说,这个 Lambda 表达式的作用是将列表中的每个元素都调用 multiply()
方法,然后返回一个包含了新元素的列表。在这个例子中,假设列表的元素类型是一个类,类中有一个名为 multiply()
的方法,那么这个 Lambda 表达式就可以这样使用:
scssCopy codeList<MyClass> myList = Arrays.asList(new MyClass(2), new MyClass(3), new MyClass(4));
List<MyClass> multipliedList = myList.stream()
.map(it -> it.multiply())
.collect(Collectors.toList());
在这个例子中,我们首先创建了一个包含了 MyClass
类型对象的列表,然后使用 Lambda 表达式对列表中的每个元素都调用 multiply()
方法,并将结果收集到一个新列表中。
需要注意的是,虽然在这个例子中使用了 “it” 作为参数名,但是你可以使用任何其他合法的参数名来代替 “it”。例如,你可以这样写 Lambda 表达式:
scssCopy codeList<MyClass> multipliedList = myList.stream()
.map(obj -> obj.multiply())
.collect(Collectors.toList());
在这个例子中,我们使用了 “obj” 作为参数名。这里的关键是在 Lambda 表达式中只有一个参数,并且使用了这个参数的隐式参数 “it”(或其他自定义参数名)。