1.背景:为了解决null值判断的问题,借助google.guava中的同名类,可以避免显示的null值判断;
2.Optional对象的创建,本质上就是一个包装其他对象额一个Optional对象;他是用静态方法构造对象;
3、常见方法的使用,以及函数的使用背景;
package com.ydlclass.feature;
import java.util.Optional;
import java.util.Scanner;
import java.util.function.Consumer;
import java.util.function.Supplier;
public class OptionalTest {
public static void main(String[] args) throws Throwable {
Optional<String> op = Optional.empty();//创建一个包装对象值为null的Optional对象
Optional<String> op2 = Optional.of("nihao");//创建一个包装对象值非空的Optional对象
Optional<String> op3 = Optional.ofNullable(null);//创建一个包装对象对象值之允许为空的Optional对象
//Optional如果使用不好只是一种冗余;
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
User user = new User("zhangsan", 2);
if (i == 0){
user = null;
}
Optional<User> op4 = Optional.ofNullable(user);
//if (op4.isPresent()) {
// String name = op4.get().getName();//将之前放入的对象提取出来,这样做如果输入的是0,就会产生空指针异常
// System.out.println(name);//如果只是这样写就毫无意义
//}
if (user != null){//还不如使用这种方法
System.out.println(user.getName());
}
//完全可以不使用isPresent()方法,Optional.isPresent()判断对象存在。
//Optional.orElse()方法提供了一种默认用户的选项,可以使用此方法得到other
User user1 = op4.orElse(new User("lisi", 0));//返回值是User,这个方法可以用于默认值的使用;
System.out.println(user1.getName());
//Optional.ifPresent()方法,方法中需要一个消费者,表示是消费掉这个对象;
//ifPresent()方***判断op4是否为空,如果是什么也不执行,如果不是那么就会让消费者调用accept(op4)消费掉op4;
//先看一个简易式的
op4.ifPresent(new Consumer<User>() {
@Override
public void accept(User user) {
System.out.println(user.getName());
}
});
//由于函数式接口,使用函数式编程
op4.ifPresent((s) -> System.out.println(s));
//接着可以再次简化
op4.ifPresent(System.out::println);//这种方式可以帮助我们使用一行代码避免空指针的存在问题
//orElseGet()方法,如果op4不为null,则返回value,如果为null,则使用生产者调用get方法,提供一个对象;
op4.orElseGet(new Supplier<User>() {
@Override
public User get() {
return new User("good",2);
}
});
//等同于这种写法
User user2 = op4.orElseGet(() -> new User("good", 2));
System.out.println(user2.getName());
//如果是这种的提供者的get方法那么还可以简化
//op4.orElseGet(()->new User());
//op4.orElseGet(User::new);
op4 = Optional.empty();
//orElseThrow这个函数如果对象不为null返回null,否则抛出一个异常
op4.orElseThrow(new Supplier<Throwable>() {
@Override
public Throwable get() {
return new RuntimeException("为空异常");
}
});
//等价于这种写法
//op4.orElseThrow(()-> new RuntimeException("异常2"));
}
}
4.全程没有使用一个if,可以解决NPE(空指针异常)