前言
JDK1.8是Oracle在2014年3月19日发布正式版的,到现在差不多接近四年了,最近公司新项目都使用JDK1.8来开发了。
这里总结下JDK8中常用的特性,部分内容整理自《Java 8 In Action》 并加上自己的理解,如有出入欢迎批评指正(✪ω✪)
Lambda表达式语法
(parameters) -> expression
或
(parameters) -> { statements; }
Lambda表达式结构
一个常见的Lambda表达式例子:
(String s) -> s.length()
它由三部分组成:
- 参数列表。例子中是String类型的变量s
- 箭头。把参数列表与Lambda主体分隔开
- Lambda主体。例子中是得出字符串的长度。表达式就是Lambda的返回值了。
例子中Lambda表达式具有一个String类型的参
数并返回一个int。
Lambda没有return语句,
因为已经隐含了return .
如何使用Lambda
你可以在函数式接口上使用Lambda表达式
什么是函数式接口?
只要接口只定义了一个抽象方法,它就是一个函数式接口。
@FunctionalInterface注解的接口都是函数式接口。
Lambda上下文类型推断
List<Apple> heavierThan150g =
filter(inventory, (Apple a) -> a.getWeight() > 150);
比如上面的例子可以简写为:
List<Apple> heavierThan150g =
filter(inventory, a -> a.getWeight() > 150);
filter方法第二个参数是Predicate<? super T> predicate
函数式接口,所以目标类型是Predicate<Apple>(T绑定到Apple)
即
Predicate<Apple> predicate = a -> a.getWeight() > 150;
Java 7中已经引入的菱形运算符(<>),利用泛型推断从
上下文推断类型.
请注意,有时候显式写出类型更易读,有时候去掉它们更易读。没有什么法则说哪种更好,对于如何让代码更易读,程序员必须做出自己的选择.
Predicate<String> p = s -> s.length()
当Lambda仅有一个参数类型需要推断时,参数名称两边的括号可以省略。
总结下:
- Lambda表达式能提升代码的可读性和灵活性。
- 如果你的代码中使用了匿名类,尽量用Lambda表达式替换它们,但是要注意二者间语义的微妙差别,比如关键字this,以及变量隐藏。