Java8概述
Java8(又称jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java8
支持Lambda表达式
函数式接口
新的Stream API
新的日期 API
其他特性
Lambda表达式
Lambda表达式:特殊的匿名内部类,语法更简洁
Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递
基本语法
<
函数式接口
> <变量名
> =(参数1
,参数2
……)->
{ //
方法体
}
Lambda引入了新的操作符 “
->
“,左侧是参数列表,右侧是方法体注意事项:
- 形参列表的数据类型会自动推断
- 如果形参列表为空,只需保留 ( )
- 如果形参只有 1 个,( ) 可以省略,只需要参数的名字即可
- 如果执行语句只有 1 句,且无返回值,{} 可以省略,若有返回值,则若想省去 {} ,则必须同时省略
return
,且执行语句也保证只有 1 句 - Lambda不会生成一个单独的内部类文件
示例:实现Runnable
1 | public static void main(String[] args) { |
函数式接口
- 如果一个接口只有一个抽象方法,则该接口称之为函数式接口,函数式接口可以使用Lambda表达式,Lambda表达式会被匹配到这个抽象方法上
- @FunctionalInterface注解 检测接口是否符合函数式接口
- 常见函数式接口:
- Predicate 接口只有一个参数,返回boolean类型。该接口包含多种默认方法来将Predicate组合成其他复杂的逻辑(比如:与,或,非);
- Function 接口有一个参数并且返回一个结果,并附带了一些可以和其他函数组合的默认方法(compose, andThen);
- Supplier 接口返回一个任意范型的值,和Function接口不同的是该接口没有任何参数;
- Consumer 接口表示执行在单个参数上的操作;
- Comparator 是老Java中的经典接口, Java 8在此之上添加了多种默认方法;
- Optional 不是函数是接口,这是个用来防止NullPointerException异常的辅助类型;
方法引用
- 方法引用是Lambda的一种简写形式 。如果Lambda表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用
- 常见形式:
- 对象
::
实例方法 - 类
::
静态方法 - 类
::
实例方法 - 类
::
new
- 对象
Stream
- 流(Stream)中保存对集合或数组数据的操作。和集合类似,但集合中保存的是数据
- Stream 自己不会存储元素
- Stream 不会改变源对象。相反它们会返回一个持有结果的新 Stream
- Stream 操作是延迟执行的。这意味着它们会等到需要结果的时候才会执行
- Stream 使用步骤:
- 创建:新建一个流
- 中间操作:在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作
- 终止操作:使用一个终止操作来产生一个结果。该操作会强制它之前的延迟操作立即执行。在这之后该Stream就不能使用了
- 创建Stream
- 通过Collection对象的 stream( ) 或 parallelStream( ) 方法
- 通过Arrays 类的 stream( ) 方法
- 通过Stream接口的 of( )、iterate ( )、generate( )方法
- 通过IntStream、LongStream、DoubleStream接口中的 of 、range 、rangeClosed方法
- 中间操作
- filter (概率)、limit (限制)、skip (跳过)、distinct (去重)、sorted(排序)
- map
- parallel (并行)
- 终止操作
- forEach 、min 、max 、count 、map 、reduce (规约)、collect (收集)