Lambda表达式可以理解为一种匿名函数;没有名称,有参数列表、函数主题、返回类型,可能还有一个可以抛出的异常列表
Lambda表达式3个部分:参数列表;箭头;主体
在哪里使用:在函数式接口上使用
函数式接口:接口只定义了一个抽象方法;
Lambda表达式允许直接以内联的形式作为函数式接口的抽象方法的提供,并把整个表达式作为接口的实例
@FunctionalInterface 表示该接口会设计成一个函数式接口
Lambda表达式使用步骤:1.行为参数化 2.使用函数式接口来传递行为 3.执行一个行为 4.传递Lambda
常用函数式接口:
Predicate 函数描述符 T -> boolean boolean test(T t)
Consumer T -> void void accept(T t)
Function T,R -> R R apply(T t)
Supplier () -> T T get()
Callable () -> T T call()
BiFunction R apply(T,U)
还有为原始类型设计的对应接口可以避免装箱。输入参数类型的函数式接口的名称要加上对应的原始类型前缀如:IntPredicate等
类型推断:
Lambda表达式的类型是从使用Lambda的上下文推断出来的;Lambda表达式需要的类型称为目标类型
如果一个Lambda的主题是一个语句表达式,它就和一个返回void的函数描述符兼容
使用局部变量:
局部变量必须显示声明为final
闭包就是一个函数的实例,且它可以无限制地访问那个函数的非本地变量
方法引用:
根据已经有的方法创建Lambda表达式
目标引用在::前,方法名称在后
如何构建方法引用:1.指向静态方法的方法引用(如:Integer :: parseInt)2.指向任意类型实例方法(String :: length)
3.指向现有对象的实例方法
方法引用是否有效:方法引用的签名必须和上下文类型匹配
构造函数引用:
ClassName::new
复合Lambda表达式的有用方法:
1.比较器复合:逆序;比较器链
2.谓词复合:谓词接口包括3个方法:negate;and; or
3.函数复合:Function接口代表的Lambda表达式复合起来; andThen; compose 都返回一个Function实例
网友评论