Java Lambda表达式

语法

  • 即使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 含义与外面一致