Java: Lambda表达式
Java: Lambda表达式
Lambda 表达式,也可称为闭包
,它是推动 Java 8 发布的最重要新特性。
Lambda 允许把函数作为一个方法的参数函数作为参数传递进方法中
使用 Lambda 表达式可以使代码变的更加简洁紧凑。
语法 :
(parameters) -> expression
//或者
(parameters) ->{ statements; }
最简单的 lambda 表达式包含单个参数和一个表达式:
parameter -> expression
要使用多个参数,请将它们括在括号中:
(parameter1, parameter2) -> expression
表达式是有限的。它们必须立即返回一个值,并且不能包含变量、赋值或语句,像if
或for
为了执行更复杂的操作,代码块可以与大括号一起使用。如果 lambda 表达式需要return
一个值,则代码块应具有一个语句。
(parameter1, parameter2) -> { code block }
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 对象,并在控制台打印,不返回任何值(像是返回void)
(String s) -> System.out.print(s)
Example
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
numbers.forEach( (n) -> { System.out.println(n); } );
}
}
import java.util.ArrayList;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> numbers = new ArrayList<Integer>();
numbers.add(5);
numbers.add(9);
numbers.add(8);
numbers.add(1);
Consumer<Integer> method = (n) -> { System.out.println(n); };
numbers.forEach( method );
}
}
interface StringFunction {
String run(String str);
}
public class Main {
public static void main(String[] args) {
StringFunction exclaim = (s) -> s + "!";
StringFunction ask = (s) -> s + "?";
printFormatted("Hello", exclaim);
printFormatted("Hello", ask);
}
public static void printFormatted(String str, StringFunction format) {
String result = format.run(str);
System.out.println(result);
}
}
变量作用域
lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String args[]){
GreetingService greetService1 = message ->
System.out.println(salutation + message);
greetService1.sayMessage("world!");
}
interface GreetingService {
void sayMessage(String message);
}
}
Lambda表达式访问外层局部变量:
```java
public class Java8Tester {
public static void main(String args[]) {
final int num = 1;
Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
s.convert(2); // 输出结果为 3
}
public interface Converter<T1, T2> {
void convert(int i);
}
}
posted on 2022-04-16 09:48 Michael_chemic 阅读(25) 评论(0) 编辑 收藏 举报