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(空指针异常)