1、如何辨别lambda表达式
lambda表达式的五种变体
Runnable noArguments = () -> System.out.println("hello world");
ActionListener oneArgument = event -> System.out.println("button clicked");
Runnable multiStatement = () -> {System.out.print("Hello");<br />System.out.print("World");}
BinaryOperator<Long> add = (x, y) -> x + y;
BinaryOperator<Long> addExplicit = (Long x, Long y) -> x + y;
2、引用值,而不是变量
在lambda表达式中,使用的变量在既成事实上必须是 final。虽然无需将变量声明为 final,但在 Lambda 表达式中,也无法用作非终态变量。如 果坚持用作非终态变量,编译器就会报错。
通过编译:
String name = getUserName();
button.addActionListener(event -> System.out.println("hi " + name));
不通过编译:
String name = getUserName();
name = formatUserName(name);
button.addActionListener(event -> System.out.println("hi " + name));
3、函数接口
函数接口是只有一个抽象方法的接口
类型推断
BinaryOperator<Long> addLongs = (x, y) -> x + y;
类型推断系统相当智能,但若信息不够,类型推断系统也无能为力。类型系统不会漫无边际地瞎猜,而会中止操作并报告编译错误,寻求帮助。比如,如果我们删掉某些类型信息,就会得到:BinaryOperator add = (x, y) -> x + y;
不通过编译