2.1 第一个Lambda表达式
例2-1 使用匿名内部类将行为和按钮单击进行关联
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击");
}
});
例 2-2 使用Lambda表达式将行为和按钮单击进行关联
button.addActionListener(e -> System.out.println("按钮被点击"));
2.2 如何辨别Lambda表达式
例2-3 编写Lambda表达式的不同形式
Runnable thread01 = () -> System.out.println("Hello World");
ActionListener listener = event -> System.out.println("按钮被点击");
Runnable thread02 = () -> {
System.out.println("Hello");
System.out.println(" World");
};
BinaryOperator<Long> add01 = (x, y) -> x + y;
BinaryOperator<Long> add02 = (Long x, Long y) -> x + y;
例2-4 等号右边的代码并没有声明类型,系统根据上下文推断出类型信息
final String[] array = {"hello", "world"};
2.3 引用值,而不是变量
例2-5 匿名内部类中使用final局部变量
final String name = getUserName();
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("hi " + name);
}
});
例2.6 Lambda表达式中引用既成事实上的final变量
final String name = getUserName();
button.addActionListener(event -> System.out.println("hi " + name));
例2.7 未使用既成事实上的final变量,导致无法通过编译
final String name = getUserName();
name = formatUserName(name);
button.addActionListener(event -> System.out.println("hi " + name));
2.4 函数接口
例2-8 ActionListener接口:接受ActionEvent类型的参数,返回空
public interface ActionListener extends EventListener {
public void actionPerformed(ActionEvent e);
}
表2-1 Java中重要的函数接口
接口 | 参数 | 返回类型 | 实例 |
---|---|---|---|
Predicate | T | boolean | 这种唱片已经发行了吗 |
Consumer | T | void | 输出一个值 |
Function<T, R> | T | R | 获得Artist对象的名字 |
Supplier | None | T | 工厂方法 |
UnaryOperator | T | T | 逻辑非(!) |
BinaryOperato | (T, T) | T | 求两个数的乘积(*) |
2.5 类型推断
2-9 使用菱形操作符,根据变量类型做推断
Map<String, Integer> oldWordCounts = new HashMap<String, Integer>();
Map<String, Integer> diamondWordCounts = new HashMap<>();
2-10 使用菱形操作符,根据方法签名做推断
useHashMap(new HashMap<>());
...
private void useHashMap(HashMap<String, String> value);
2-11 类型推断
Predicate<Integer> atLeast5 = x -> x > 5;
2-12 Predicate接口的源码,接受一个对象,返回一个布尔值
public interface Predicate<T> {
boolean test(T t);
}
2-13 略显复杂的类型推断
BinaryOperator<Long> addLongs = (x, y) -> x + y;
2-14 没有泛型,代码则通不过编译
BinaryOperator addLongs = (x, y) -> x + y;
注意:运算符 ‘+’ 不能应用于 ‘java.lang.Object’、‘java.lang.Object’
2.6 要点回顾
- Lambda表达式是一个匿名方法,将行为像数据一样进行传递。
- Lambda表达式的常见结构: BinaryOperator add = (x, y) -> x + y。
- 函数接口指仅具有单个抽象方法的接口,用来表示Lambda表达式的类型。