Java 8实战阅读-Optional避免空指针

Java 8中引入了一个新的类java.util.Optional<T>,对存在或缺失的变量值进行建模

主要方法如下:(摘自《Java8实战》)

==================================================================================================

empty        返回一个空的Optional 实例
filter           如果值存在并且满足提供的谓词,就返回包含该值的Optional 对象;否则返回一个空的Optional 对象

flatMap      如果值存在,就对该值执行提供的mapping 函数调用,返回一个Optional 类型的值,否则就返回一个空的Optional 对象
get             如果该值存在,将该值用Optional 封装返回,否则抛出一个NoSuchElementException 异常
ifPresent    如果值存在,就执行使用该值的方法调用,否则什么也不做
isPresent    如果值存在就返回true,否则返回false
map            如果值存在,就对该值执行提供的mapping 函数调用
of                将指定值用Optional 封装之后返回,如果该值为null,则抛出一个NullPointerException异常
ofNullable   将指定值用Optional 封装之后返回,如果该值为null,则返回一个空的Optional 对象
orElse         如果有值则将其返回,否则返回一个默认值
orElseGet    如果有值则将其返回,否则返回一个由指定的Supplier 接口生成的值
orElseThrow  如果有值则将其返回,否则抛出一个由指定的Supplier 接口生成的异常

==================================================================================================

实践代码如下:

package com.csdn.test;

import java.util.Optional;

import com.csdn.test.OptionalPerson.Person.Car;
import com.csdn.test.OptionalPerson.Person.Car.Insurance;

public class OptionalPerson
{
    
    static class Person
    {
        Car car;

        public Car getCar()
        {
            return car;
        }

        public void setCar(Car car)
        {
            this.car = car;
        }

        static class Car{
            Insurance insurance;
            
            public Insurance getInsurance()
            {
                return insurance;
            }

            public void setInsurance(Insurance insurance)
            {
                this.insurance = insurance;
            }

            static class Insurance
            {
                String name;

                public String getName()
                {
                    return name;
                }

                public void setName(String name)
                {
                    this.name = name;
                }
                
            }
        }
    }
    
    // 复杂的空检查
    public static String getName(Person p)
    {
        if(null == p)
        {
            return "";
        }
        if(null == p.getCar())
        {
            return "";
        }
        if(null == p.getCar().getInsurance())
        {
            return "";
        }
        String ret = p.getCar().getInsurance().getName();
        return ret == null ? "" : ret;
    }
    
    public static String getName4Optional(Person p)
    {
        Optional<Person> personOpt = Optional.of(p);
        String ret = personOpt.map(Person::getCar)
                              .map(Person.Car::getInsurance)
                              .map(Person.Car.Insurance::getName)
                              .orElse("");
        return ret;
    }

    public static void main(String[] args)
    {
        Person p = new OptionalPerson.Person();
        System.out.println(getName(p));
        System.out.println(getName4Optional(p));
        
        Person p1 = new OptionalPerson.Person();
        Insurance i = new OptionalPerson.Person.Car.Insurance();
        i.setName("name");
        Car c = new OptionalPerson.Person.Car();
        c.setInsurance(i);
        p1.setCar(c);
        System.out.println(getName(p1));
        System.out.println(getName4Optional(p1));
    }

}

输出:

name
name
 

猜你喜欢

转载自blog.csdn.net/zangdaiyang1991/article/details/84191005