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