Java8版本给我们带来了一些经验的新特性,让我们这些辛苦的码农们体验到编程更快,更简,更紧凑的乐趣。废话不多说,下面对Java8的一些重要的新特性,比如Lambda、Stream、Optional等功能展开描述。
这章先介绍一下Lambda表达式
介绍:Lambda本质上是一个匿名函数,我们可以像传递数据(对象,基本数据类型等)一样传递Lambda表达式。这样,我们的代码更简洁、紧凑、灵活,从而使Java的表达能力得到了极大的提升。
比如:
匿名内部类(6行代码):
Lambda表达式(1行代码):
怎么样,是不是简洁多了。不要急,Lambda的表达能力不局限于此,下面我们一起细细展开
1、函数式接口
可以用Lambda表达式的接口叫做函数式接口,那么函数式接口满足哪些条件呢?
①只有一个抽象方法。
②我们可以使用@FunctionalInterface注解来强制要求这个函数式接口只有一个抽象方法。如果不满足,编译器提示不通过。(这个注解不是必须,只是起到强制一个抽象方法的作用,类似于方法重写的@override注解)
2、Lambda的表达语法
Lambda在Java语言中引入了一种新的操作符,“->”,我们称之为“箭头操作符”或者“Lambda操作符”。它将Lambda表达式划分为两个部分:
左侧:Lambda表达式的所有参数
右侧:Lambda体,即Lambda表达式所要执行的功能。
下面例举一些常用的格式:
①格式一:无参,无返回值
②格式二:只有一个参数
③格式三:只有一个参数时,参数的小括号可以省略
④格式四:两个参数,并且有返回值
⑤当Lambda体只有一天返回语句时,return和大括号可以省略
⑥参数类型可以省略,因为编译器可以根据上下文推断得出,称作“类型推断”
3、作为参数传递的Lambda表达式
对应的参数类型是与该Lambda表达式兼容的函数式接口
4、Java内置四大核心函数式接口
Java8为我们内置了几个核心函数式接口,用它们可以满足我们遇到的绝大多数一般性的需求。
5、其它一些接口
这些接口由四大核心函数式接口衍生而来,作为功能扩展和补充
6、方法引用
当Lambda体有其它方法已经实现时,可以使用方法引用。
注意:方法引用的方法参数列表必须与实现的函数式接口抽象方法的参数类别一致,返回值也一致。
我们用“类名/对象名::方法名”符号表示方法引用,将类名/对象名与方法名区分开来。主要有以下三种格式:
①类名::静态方法名(ClassName::StaticMethodName)
--方法引用的方法参数列表必须与实现的函数式接口抽象方法的参数类别一致,返回值也一致。
②对象名::实例方法名;(InstanceName::InstanceMethodName)
--方法引用的方法参数列表必须与实现的函数式接口抽象方法的参数类别一致,返回值也一致。
③类名::实例方法名。(ClassName::InstanceMethodName)
--函数式接口的第一个参数是引用方法体中的调用对象,其它参数依次为引用方法体的参数,返回值也一致。
6、构造器引用
格式:类名::new(ClassName::new)
引用的构造器的参数与函数式接口的构造器的参数一致。
7、数组引用
格式:类型[]::new(type[]::new)
函数式接口的抽象方法的参数为创建数组的大小