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 表达式中,也无法用作非终态变量。如 果坚持用作非终态变量,编译器就会报错。

通过编译:

  1. String name = getUserName();
  2. button.addActionListener(event -> System.out.println("hi " + name));

不通过编译:

  1. String name = getUserName();
  2. name = formatUserName(name);
  3. button.addActionListener(event -> System.out.println("hi " + name));

3、函数接口

函数接口是只有一个抽象方法的接口

类型推断

BinaryOperator<Long> addLongs = (x, y) -> x + y;
类型推断系统相当智能,但若信息不够,类型推断系统也无能为力。类型系统不会漫无边际地瞎猜,而会中止操作并报告编译错误,寻求帮助。比如,如果我们删掉某些类型信息,就会得到:
BinaryOperator add = (x, y) -> x + y;
不通过编译