jdk8特性
函数式接口
接口中有且只有一个抽象方法
@FunctionalInterface注解 – 表示此接口为函数式接口,约束接口中只能有一个抽象方法
使用
一般可以作为方法的参数和返回值类型
当一个方法的参数是函数式接口时,调用此方法时可以传入接口的实现类,也可以用lambda表达式来实例化函数式接口。(实际上是对匿名内部类写法的简化,但lambda表达式创建的匿名内部类,编译后不会有class文件,原理上与匿名内部类不太相同,性能会有所提高)
lambda表达式-延迟执行
有些代码执行之后,结果不一定会被使用,从而造成性能浪费,而lambda表达式是延迟执行的,在需要被用到时才会执行,所以正好可以作为解决方案,提升性能
常用的函数式接口
supplier、consumer等
Stream流
可以方便的操作集合和数组
获得Stream流方法:1,集合直接.Stream() 2.数组使用Stream.of(数组)
Stream流常用方法
延迟方法:返回值依然是Stream接口类型,因此可以链式调用
终结方法:返回值不再是Stream接口类型。count、match、foreach方法
forEach:遍历,参数consumer接口
filter:过滤,参数predicate接口,有返回值,返回一个子stream流
map:映射,把一个流数据映射到另一个类型的流中
count:统计个数
limit:截取前几个
skip:跳过前几个
concat:合并流
stream流属于管道流,只能被消费一次,数据流转到下一个流后,之前的流就关闭了。
方法引用
可以使用方法引用优化lambda表达式,例如:s -> System.out.println(s) == System.out::println
:: 引用运算符