Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};*/
Consumer<String> con1 = x -> System.out.println(x);
con1.accept("Lambda Expressions");
}
```
## Lambda 表达式的核心概念
Lambda表达式是Java 8引入的一种新特性,它是一种更简洁、更抽象的方式来表示功能接口(只有一个抽象方法的接口)的实现。这种表达式的主要目的是为了简化代码,特别是在处理函数式编程场景时。
### 1. 箭头操作符(->)
Lambda表达式中的箭头操作符 "->" 用于分隔参数列表和函数体。左边是参数,右边是执行的代码块。
### 2. 参数列表
参数列表定义了Lambda表达式所接受的输入参数。如果参数类型可以从上下文中推断出来,那么可以省略类型声明。例如:
```java
(int x, int y) -> x + y
```
可以简化为:
`(x, y) -> x + y`
### 3. Lambda体(函数体)
Lambda体包含了实际的操作,可以是一条语句或一个表达式。如果Lambda体只有一条语句,可以省略大括号 `{}`:
```java
Runnable r = () -> System.out.println("Hello Lambda");
```
如果有多条语句,就需要使用大括号来包裹:
```java
Runnable r = () -> {
System.out.println("Hello");
System.out.println("Lambda");
};
```
### 4. 接口与抽象方法
Lambda表达式必须关联到一个具有单个抽象方法的接口。这是因为Lambda表达式实际上是一个匿名类的实例,这个匿名类实现了指定的接口。例如,`Runnable` 和 `Consumer` 都是常见的Lambda表达式使用的接口。
### 5. 函数式接口
函数式接口是指只有一个抽象方法的接口。Java 8提供了一些预定义的函数式接口,如 `Function`, `Predicate`, `Supplier`, `Consumer` 等。这些接口在进行函数式编程时非常有用。
### 6. 方法引用和构造器引用
除了Lambda表达式,Java 8还引入了方法引用和构造器引用,它们允许直接引用已有方法或构造器,进一步简化代码。例如:
```java
List<String> list = Arrays.asList("a", "b", "c");
list.forEach(System.out::println); // 方法引用
```
### 7. 变量的作用域
Lambda表达式内的变量访问遵循以下规则:
- 可以访问局部变量,但必须是final或effectively final(即,实际上不可重新赋值的变量)。
- 可以直接访问类的静态成员和方法。
- 可以访问捕获的外部对象的成员。
### 示例
```java
int i = 2;
Consumer<String> con1 = (x) -> System.out.println(i); // 不可行,因为 'i' 不是final
final int j = 2;
Consumer<String> con2 = (x) -> System.out.println(j); // 可行
```
以上就是Lambda表达式的基本概念和用法。通过使用Lambda,你可以编写更简洁、更易读的代码,尤其在处理集合操作、事件处理以及多线程等场景下。