第二章 Lambda表达式
2019-07-01 本文已影响0人
大唐雷恋
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
System.out.println("button clicked");
}
});
引入Lambda表达式后:
button.addActionListener(event -> System.out.println("button clicked"));
编写Lambda表达式的不同形式:
Runnable noArguments = () -> System.out.println("Hello World");
ActionListener oneArgument = event -> System.out.println("button clicked");
Runnable multiStatement = () -> {
System.out.print("Hello");
System.out.println(" World");
};
BinaryOperator<Long> add = (x, y) -> x + y;
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
Lambda表达式本身的类型:函数接口
函数接口
java中重要的函数接口
image.png
类型推断
Map<String,Integer> diamondWordCounts = new HashMap<>();
Java 7 中程序员可省略构造函数的泛型类型,Java 8 更进一步,程序员可省略Lambda 表达式中的所有参数类型。再强调一次,这并不是魔法,javac 根据Lambda 表达式上下文信息就能推断出参数的正确类型。程序依然要经过类型检查来保证运行的安全性,但不用再显式声明类型罢了。这就是所谓的类型推断。
Predicate接口的源码,接受一个对象,返回一个布尔值
public interface Predicate<T>{
boolean test(T t);
}
image.png
BinaryOperator<Long> addLongs = (x, y) -> x + y;
类型推断系统相当智能,但若信息不够,类型推断系统也无能为力。类型系统不会漫无边际地瞎猜,而会中止操作并报告编译错误,寻求帮助
BinaryOperator add = (x, y) -> x + y;
编译器给出的报错信息如下:
Operator '& #x002B;' cannot be applied to java.lang.Object, java.lang.Object.
要点回顾
1.Lambda 表达式是 一个匿名方法,将行为像数据一样进行传递。
2.Lambda表达式的常见结构:BinaryOperator<Integer> add = (x, y) → x + y。
3.函数接口指仅具有单个抽象方法的接口,用来表示 Lambda表达式的类型。