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
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值