一、Lambda管中窥豹
1、lambda没有名称,但它有参数列表,函数主体,返回类型,可能还有一个可以抛出的异常列表。
2、基本语法:
(parameters)->expression
或
(parameters)->{statements;}
二、在哪里以及如何使用Lambda
1、函数式接口
(1)函数式接口就是只定义一个抽象方法的接口(可以有多个默认方法)
(2)Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体来说,是函数式接口一个具体实现的实例)
2、函数描述符
函数式接口的抽象方法的签名基本上就是Lambda表达式的签名。
三、把Lambda付诸实践:环绕执行模式
1、第1步,记得行为参数化
public static String processFileLimited() throws IOException {
try (BufferedReader br =
new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))) {
return br.readLine();
}
}
2、第2步,使用函数式接口来传递行为
public interface BufferedReaderProcessor{
public String process(BufferedReader b) throws IOException;
}
public static String processFile(BufferedReaderProcessor p) throws IOException {
}
3、第3步:执行一个行为
public static String processFile(BufferedReaderProcessor p) throws IOException {
try(BufferedReader br = new BufferedReader(new FileReader("lambdasinaction/chap3/data.txt"))){
return p.process(br);
}
}
4、第4步:传递Lambda
String oneLine = processFile((BufferedReader b) -> b.readLine());
System.out.println(oneLine);
String twoLines = processFile((BufferedReader b) -> b.readLine() + b.readLine());
System.out.println(twoLines);
四、使用函数式接口
五、类型检查、类型推断以及限制
1、类型检查
类型检查过程可以分解为如下所示。
首先、你要找出filter方法的声明
第二、要求它是Predicate<Apple>(目标类型)对象的第二个正式参数。
第三、Predicate<Apple>是一个函数式接口,定义了一个叫作test的抽象方法。
第四、test方法描述了一个函数描述符,它可以接收一个Apple,并返回一个boolean
最后、filter的任何实际参数都必须匹配这个要求。
2、同样的Lambda,不同的函数式接口
Comparator<Apple> c1 =(Apple a1,Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
ToIntBiFunction<Apple,Apple> c2 =(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
BiFunction<Apple,Apple,Integer> c3 =(Apple a1, Apple a2)->a1.getWeight().compareTo(a2.getWeight()):
3、类型推断
编译器可以了解Lambda表达式的参数类型,这样就可以在Lambda语法中省去标注参数类型。
4、使用局部变量
Lambda可以没有限制地捕获(也就是在其主体中引用)实例变量和静态变量。但局部变量必须显示声明final,或事实上是final。换句话说,Lambda表达式只能捕获指派给它们的局部变量。(注:捕获实例变量可以被看做捕获最终局部变量this)
六、方法引用
1、管中窥豹
使用方法引用时,目标引用放在分隔符::前,方法的名称放在后面。
2、构造函数引用
七、Lambda和方法引用实战
八、符合Lambda表达式的有用方法
1、比较器复合
(1)、逆序
(2)、比较器链
2、谓词复合
谓词接口包括三个方法:neget、and和or
3、函数复合
九、数学中的类似思想
1、积分
2、与java8的Lambda联系起来