精通 Java 8 Lambda 表达式:函数式编程入门指南
Lambda 语法
(parameters) -> expression
(parameters) -> { statements; }
四大简化特性
- 类型可省:编译器推断参数类型,
(int a, int b) -> a+b→(a, b) -> a+b。 - 单参数括号可省:
(a) -> a*2→a -> a*2。 - 单表达式大括号与 return 可省:
{ return a+b; }→a+b。 - 隐式返回:表达式形式自动返回值。
完整示例
public class Java8Tester {
public static void main(String[] args) {
Java8Tester tester = new Java8Tester();
// 1. 带类型声明
MathOperation addition = (int a, int b) -> a + b;
// 2. 无类型声明
MathOperation subtraction = (a, b) -> a - b;
// 3. 语句块需 return
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 4. 单表达式无大括号无 return
MathOperation division = (int a, int b) -> a / b;
System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
System.out.println("10 / 5 = " + tester.operate(10, 5, division));
// 无参数、单参数简化
GreetingService greet1 = message -> System.out.println("Hello " + message);
GreetingService greet2 = (message) -> System.out.println("Hello " + message);
greet1.sayMessage("Mahesh");
greet2.sayMessage("Suresh");
}
interface MathOperation { int operation(int a, int b); }
interface GreetingService { void sayMessage(String message); }
private int operate(int a, int b, MathOperation op) {
return op.operation(a, b);
}
}
输出:
10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Mahesh
Hello Suresh
核心概念:函数式接口
Lambda 仅能赋值给 单抽象方法接口(SAM)。MathOperation 与 GreetingService 均为函数式接口。Java 8 提供 @FunctionalInterface 注解编译期校验。
变量作用域
- 可引用
final或 effectively final(仅赋值一次)局部变量、成员变量、静态变量。 - 不能修改捕获的局部变量(编译错误)。
this指向外围类实例,非 Lambda 自身(Lambda 无独立this)。
作用域示例
public class Java8Tester {
final static String salutation = "Hello! ";
public static void main(String[] args) {
GreetingService gs = message -> System.out.println(salutation + message);
gs.sayMessage("Mahesh");
}
interface GreetingService { void sayMessage(String message); }
}
// 输出: Hello! Mahesh
方法引用等价形式
| Lambda | 方法引用 | 类型 |
|---|---|---|
() -> obj.method() | obj::method | 实例方法引用 |
(args) -> Class.staticMethod(args) | Class::staticMethod | 静态方法引用 |
(obj, args) -> obj.method(args) | Class::method | 任意对象实例方法引用 |
() -> new Class() | Class::new | 构造器引用 |
java
- 精通 Java 运算符:类型、语法与实战示例
- 理解 Java 表达式、语句与代码块
- Java 注释:类型、用法与最佳实践
- 精通 Java 增强 for 循环:语法、示例与最佳实践
- 精通 Java 字符串:创建、方法与最佳实践
- 精通 Java 接口:概念、实现与最佳实践
- 精通 Java 匿名内部类:定义、语法与实战示例
- 精通 Java Try-With-Resources:自动资源管理详解
- Java 注解详解:类型、放置位置与实战示例
- Java 断言实战指南:尽早发现 Bug 与保障代码可靠性
- 深入理解 Java Vector:用法、特性及与 ArrayList 的对比
- 掌握 Java Lambda 表达式:从基础到 Stream API 实战