注意:所有文章除特别说明外,转载请注明出处.
[TOC]
Java8 新特性
==一、Lambda 表达式==
1. Lambda 表达式使用前后对比
使用前:
1 | //例一: |
使用后:
1 | //例一: |
2.Lambda 表达式的基本语法
1 | * 1. 举例: |
3.Lambda 表达式的使用(6种情况)
无参,无返回值。
1 |
|
需要一个参数,无返回值。
1 |
|
类型推断。
1 |
|
Lambda 若只需要一个参数,参数的小括号可以省略
1 |
|
Lambda 需要两个或者多个参数,多条执行语句,并且可以有返回值
1 |
|
当 lambda 体只有一条语句时,return 与大括号若有,都可以省略
1 |
|
4.总结:
-> 左边:Lambda 形参列表的参数类型可以省略(类型推断),如果形参列表只有一个参数,其一对() 也可以省略
-> 右边: Lambda体 应该使用一对{} 包裹,如果只有一条执行语句(可能是return 语句),可以省略大括号以及 return 关键字
5.Lambda 表达式的实质
==Lambda表达式的本质: 作为函数式接口的实例。==
6.何时使用Lambda表达式:
当需要给一个函数式接口实例化的时候,可以使用Lambda表达式。
以前可以通过匿名实现类表示的现在都可以用Lambda表达式来书写.
7.常使用的Lambda表达式
1 | //常用的Lambda 表达式 |
二、函数式接口
1.什么是函数接口:
如果一个接口只声明了一个抽象方法,那么这个接口就成为函数式接口,我们可以在接口上面使用@FunctionalInterface 这个注解,用来检查它是否是一个函数式接口
2.Java内置四大核心函数式接口
消费型接口:Consumer
供给型接口:Supplier
函数型接口:Function<T, R> R apply(T t)
断定型接口:Predicate
3.何时使用函数式接口:
如果我们的开发中需要定义一个函数式接口,首先看看在已有的JDK提供的函数式接口是否提供了能满足需求的函数式接口,如果有则直接使用即可。
三、方法引用
1.理解
方法引用可以看做是 Lambda 表达式的深层次的表达,换句话说,方法引用就是 Lambda 表达式,也就是函数式接口的一个实例,也可以认为是 Lambda 表达式的一个语法糖。
2.使用场景
当要传递给Lambda 体的操作,已经有实现的方法了,可以使用方法引用。
3.格式
类(对象) :: 方法名
4.分为以下三种情况
对象 :: 非静态方法
类 :: 静态方法
类 :: 非静态方法
5.要求
要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的形参列表和返回值类型相同。(针对 情况1 或者 情况2)
当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或者无参数)时: ClassName :: methodName
6.使用建议
如果给函数式接口提供实例,恰好满足我们的方法引用的要求,大家就可以考虑给我们的函数式接口提供实例,如果不熟悉方法引用,那么还可以使用 Lambda 表达式。
7.使用举例:
1 | public class LambdaTest3 { |
四、构造器引用以及数组引用
1 | //构造器引用: |
==五、Stream API==
1.Stream API 的理解
- Stream 关注的是对数据的运算,与CPU打交道。集合关注的是对数据的存储,与内存打交道。
- Java8 提供了一套api,使用这套api可以对内存中的数据进行过滤,排序,映射,规约等操作,类似于sql语句。
2.注意点
①:Stream 自己不会存储元素
②:Stream 不会改变原对象,相反,他们会返回一个持有结果的新的Stream。
③:Stream 的操作时延迟执行的。这也就意味着他们会等到需要结果的时候才执行
3.Stream的使用流程
①:Stream 的实例化
②:一系列的中间操作(过滤,映射,规约等)
③:终止操作。
4.使用流程的注意点
4.1 一个中间操作链,对数据源的数据进行处理。
4.2 一旦执行终止操作,就执行中间操作链,之后,不会再被使用
5.步骤一:Stream的实例化
1 | public class StreamAPITest1 { |
6.步骤二:中间操作
1 | public class StreamAPITest2 { |
7.步骤三:终止操作
1 | public class StreamAPITest3 { |
六、Optional类的使用
1.理解:
==为了解决空指针而生==
Optional
2.常用方法:
1 | public class OptionalTest2 { |
3.典型练习:
总之 Optional 就是为了尽可能避免 空指针异常而出现的
1 | //使用 Optional 类 |