Java8InAction学习笔记(一) - 18965050/Java8InAction GitHub Wiki

Lamda表达式

四个特点:

  • 匿名
  • 函数化
  • 简洁

格式:

//不加大括号, 表达式
(parameters) -> expression

或

//加大括号, 语句
(parameters) -> { statements; }

函数接口

函数接口是使用lambda表达式的基础. 函数接口指的是只有一个抽象方法的接口(注意, Java8中支持default方法实现).比如Comparator. 这个方法被称为函数描述符(function descriptor)

Java8中的一些功能函数接口 公共的函数接口

@FunctionalInterface

此注解放在函数接口上,用于编译校验. 此注解对函数接口并非是必须的,但我们建议这么做

Java8中提供的一些函数接口

  • Predicate(T-> boolean): 对象条件测试
  • Function(T -> R): 用于对象转换
  • Consumer(T -> void): 用于对象消费
  • Supplier(() -> T): 用于对象生成

lambda的类型推理

(Apple a)-> "green".equals(a.getColor())
可被推理为:
(a)-> "green".equals(a.getColor())
或
a-> "green".equals(a.getColor()) //只有一个参数的情况

capturing lambda

lambda表达式可使用外部变量. 对应实例和静态变量, 没有限制. 但对于局部变量必须是final或有效final(effective final)的.

方法引用

方法引用在已有的方法上实现函数式接口的方式调用(即lambda表达式的替换). 比如:

Comparator.comparing(p -> p.getName());

//可写为

Comparator.comparing(Person::getName);

构造器引用

通过 ClassName::new解决