语法
- 即使lambda表达式没有参数,仍然要提供空括号,类似于无参方法
() -> {....}
- 如果可以推导出一个lambda表的参数类型,则可以忽略其类型
(s1 , s2) -> {....}
- 如果方法只有一个参数,而且这个参数类型可以推导出,那么可以省略小括号
a -> {....}
函数式接口
- 只有一个抽象方法的接口,可以提供一个lambda表达式
- 在Java中,对lambda表达式所能做的也就是转换为函数式接口
- ArrayList类有一个 removeIf 方法,它的参数就是一个 Predicate,这个接口用来传递 lambda 表达式 如,下面的语句将从一个数组列表删除所有null值
list.removeIf(e -> e == null)
方法引用
System.out::println;
- 指示编译器生成一个函数式接口的实例
- 类似于lambda表达式,方法引用也不是一个对象
- 要用 :: 运算符分隔方法名 与 对象 或 类名
- 对象::实例方法 lambda参数作为方法的显示参数传入
- 类::实例方法 String::trim ,lambda表达式会成为隐式对象
- 类::静态方法 Integer::valueOf,lambda表达式会传递到这个静态方法
- 方法引用不能独立存在,总是会转换为函数式接口的实例
- 包含对象的方法引用 与 等价的lambda表达式还有一个细微差别 如果对象为空,方法引用会直接抛出异常,而lambda表达式只有在调用时才会抛出异常
- 可以在方法引用中使用 this 、super参数
构造器引用
- 与方法引用类似,不过方法名为 new
- 数组的构造器引用 Integer[]::new
变量作用域
- lambda表达式可以“捕获”外围作用域中变的值,只要确保所捕获的值时明确定义的
- lambda表达式的与 嵌套块 有相同的作用域,在lambda表达式中声明一个与局部变同名的参数或局部变是不合法的
- lambda表达式中的 this 含义与外面一致