Java8新特性:速度更快,代码更少,stream API,便于并行,最大化减少空指针异常:Optional
Lambda表达式
好处:
Lambda是一个匿名函数,可以把lambda表达式理解为一段可以传递的代码,写出更简洁,更灵活的代码,使得Java语言表达能力得到提高
Lambda表达式只能为函数式接口的形参,变量赋值(SAM)
public class TestLambda1 {
public static void main(String[] args) {
//需要override run()方法
new Thread(){
public void run(){
print();
}
}.start();
//用thread()启动runnable()
new Thread(new Runnable() {
public void run() {
print();
}
}).start();
//匿名函数 lambda表达式,减少了代码量
new Thread(() -> print()).start();
}
private static void print(){
for(int i=0; i<=9; ++i){
System.out.println(i);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
函数式接口
具有SAM特性的接口(Single abstract method):
使得以这种类型的接口为参数时,可以使用Lambda表达式为参数,底层可以进行解析,不影响功能,减少代码量
函数式接口必定使用@FunctionalInterface进行修饰
注解: @FunctionalInterface
SAM原则的两个意外情况:
抽象类的默认方法和静态方法并不影响函数式接口的契约,可以随意使用
可以有Object重写的方法,toString() hashcode(),equals()方法
Java四大核心函数式接口
名称 函数式 参数类型 返回值 用途
消费型接口 Consumer< T > T void
供给型接口 Supplier< T >
断定型接口 Predicate< T >
函数型接口 Function<T,R>
Lambda基本语法
格式:
无参无返回值:
形式:() ->{Lambda 体}
说明: 如果Lambda体只有一句,那么{ ;}可以省略
1
2
无参有返回值:
()->{Lambda体}
说明:如果Lambda体只有一个语句,那么{return;}可以省略
如果{}没有省略,那么return也不可以省略
()不可以省略
1
2
3
4
有参无返回值:
消费型:
(形参列表)->{Lambda体}
说明:如果Lambda体只有一个语句,那么{;}可以省略
如果他的形参类型是确定的,或是可以推断的,形参类型可以省略
如果形参列表只有一个,那么形参和()都可以省略
1
2
3
4
5
6
有参有返回值:
(形参列表)->{Lambda体}
说明:如果Lambda体只有一个语句,{return ; }可以省略
如果形参的类型是确定的,或者是可以推断的,那么形参的类型可以省略
如果他的形参只有一个形参,那么()和数据类型都可以省略
形参名不可以省略,但是形参名可以和接口的抽象方法的形参名不一样
1
2
3
4
5
四大类核心的函数式接口:
1.消费型接口:
抽象方法有参数无返回值
Interface Consumer<T>:void accept(T t)
2.供给型:
抽象方法:有返回值无参
Interface Supplier<T>: T get()
3.功能性:
抽象方法:有参有返回值
Interface Function<T,R>
R apply<T t>
4.判断型:
抽象方法:返回值是boolean
Interface Predicate<T>: boolean test(T t)
JDK1.8中的optional
背景 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。
Optional类是一个容器类,代表一个值存在还是不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
常用方法:
Optional.of(T t):创建一个optional对象实例,t不能为null
Optional.empty():创建一个空的optional实例对象
Optional.ofNullable(T t):t可以为null,若不为null创建实例,否则创建optional空实例
isPresent()是否包含值
T get():如果调用对象包含值,则返回,否则抛出异常
orElse(): 有值返回,否则返回指定值
orElseGet():与orElse()类似,区别在于得到的默认值,orElseGe()通过Supplier的接口的默认实现生成返回值
orElseThrow():如果有值则将其返回,否则抛出supplier接口创建的异常
---------------------
转载,仅作分享,侵删
作者:qq1010234991
原文:https://blog.csdn.net/qq1010234991/article/details/83715039
|
|