lambda表达式
这是《Java8编程参考官方教程》第15章的笔记。
lambda表达式:起始自JDK 8。
- lambda表达式:e.g. () -> 123.45;
- 函数式接口:仅包含一个抽象方法的接口。
没有指定默认实现的接口方法隐式地是抽象方法。
lambda表达式不是独立执行的,而是构成了一个函数式接口定义的抽象方法的实现,该函数式接口定义了它的目标类型。
可以(int n, int n) -> 123.45+543.21
也可以(n, n)-> 123.45+543.21
但不可以(int n, n)-> 123.45+543.21
块lambda表达式:比lambda表达式(表达式体)增加了一对花括号,必须显式使用return语句来访问值。
泛型函数式接口:lambda表达式不能指定类型参数。因此,lambda表达式不能是泛型。然而,与lambda表达式关联的函数式接口可以是泛型。
作为参数传递lambda表达式: 略(名如其用)。
lambda表达式与异常:lambda表达式可以抛出异常,该异常必须与函数式接口的抽象方法的throws子句中列出的异常兼容。
lambda表达式和变量捕获:lambda表达式可以使用和修改其调用类的实例变量,只是不能使用其外层作用域内的局部变量,除非该变量实质上是final变量。
lambda表达式也可以显式或隐式地访问this变量。
外层作用域的this参数自动是实质上final的变量,lambda表达式没有自己的this参数。
一个变量实质上是final变量时,也不一定必须显式的在前面有一个final修饰符。
方法引用:好难理解的一个特性。
提供了一种引用而不执行方法的方式。
它也需要兼容函数式接口构成的目标类型上下文。
- 静态方法的方法引用:ClassName::methodName类的静态方法应用;
- 实例方法的方法引用:objRef::methodName指定对象的方法引用;className::methodName给定类的任何对象而不仅指定对象的方法引用;
- 泛型的方法引用:泛型方法的引用:className::<typeParam>methodName;泛型类的方法引用:className<typeParam>::methodName。
构造函数引用:
- className::new;
- 泛型的构造函数引用:className<typeParam>::new。
- 用于数组的构造函数引用:typeName[]::new
预定义的函数式接口:JDK 8中包含了新包java.util.function。其中提供了一些预定义的函数式接口,使我们不必在程序中定义自己的函数式接口了。
p.s.lambda表达式和我以前想的一点也不一样。有点难理解... ...
后面的章节就是Java库了,就是说具体函数的,要是做笔记就麻烦了,所以这本书的笔记到此为止了。