jdk1.8 Optional

使用 Optional 解决 NPE(java.lang.NullPointerException)问题,它就是为 NPE
而生的,其中可以包含空值或非空值

```java
//原始案例
public String optional1(Person person){
    if(person != null){
        if(person.getStudent() != null){
            String name = person.getStudent().getName();
            if(name != null){
                return name.toUpperCase();
            }
        }
    }
    return null;
}

//使用Optional
public static String optional2(Person person){
    return Optional.ofNullable(person)
        .map(Person::getStudent)
        .map(Student::getName)
        .map(String::toUpperCase).orElse(null);
}

实战:

package nccloud.api.testcase.base;

import java.util.Optional;
public class OptionalTest {
    public static void main(String[] args) {
        test1();
    }

    public static void test1() {

        //isPresent 判断容器中对象是否为空
        //ofNullable 可以接受任何对象(空或者非空) 

        Person person1 = new Person();
        boolean present = Optional.ofNullable(person1).isPresent();// true:person1不为空 false:person1为空
        System.out.println(present);//true
        
        //of 只能接受非空的对象
//        person1=null;
//        Optional of = Optional.of(person1);//如果 person1=null; 报空指针
//        System.out.println("Optional:"+of);

        //get 返回optional容器中的数据 
        //需注意如果返回的是空Optional使用get()方法会出错!!!

        person1.setStudents(new Student("zfq","23",1));
        Person person = Optional.ofNullable(person1).get();
        System.out.println(person.getStudents().toString());//Student{name='zfq', sex='23', age=1}
        
        // 如果Optional容器中的对象不为空,执行函数接口中的方法
        Student student=new Student("xyl", "nv", 1);
        Optional.ofNullable(student).ifPresent(System.out::println);//Person person1 = new Person();

        // orElse 如果对象不是空,返回Optional容器中的值,否则返回orElse中的值
        // 需要注意方法返回类型需要和orElse函数表达式返回的类型一致!!!

        String str = null;
        String s = Optional.ofNullable(str).orElse("dont input empty string !");
        System.out.println(s);// dont input empty string !

        String str1 = "";
        String s1 = Optional.ofNullable(str1).orElse("dont input empty string !");
        System.out.println(s1);// 空

        //orElseGet 如果容器中对象为空则返回函数表达式结果,跟orElse区别是可以执行一个函数
        person1 = null;
        Person res = Optional.ofNullable(person1).orElseGet(() -> {
            Person ps = new Person();
            ps.setStudents(new Student("xyl", "nv", 1));
            return ps;
        });

        System.out.println(res.getStudents().getName());// xyl

        // 如果容器中是空值,返回自定义异常
//        person1 = null;
//        Optional.ofNullable(person1).orElseThrow(() -> new RuntimeException("this is RuntimeException !"));

        //filter 根据条件进行过滤,满足返回该对象,否则返回空Optional
        //map 将Optional中的对象当做参数执行函数接口,如果参数是空返回空的Optional对象,如果不是执行结果并放在Optional容器中返回

        Student stud=new Student("xyl", "nv", 1);
        String orElse = Optional.ofNullable(stud).filter(st -> st.getName().contains("x")).map(Student::getName).map(String::toUpperCase).orElse("name is null");
        System.out.println(orElse);//XYL

    }

}
 

你可能感兴趣的:(jdk1.8,java)