第二章 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表达式的类型。

上一篇下一篇

猜你喜欢

热点阅读