android中优雅的处理nullPointException(java8 Optional)

本文介绍了如何使用Java8的Optional API来避免NullPointerException。通过示例代码展示了Optional的构造函数、map、flatMap、ifPresent、isPresent、orElse等方法的用法,并解释了它们的区别。此外,还讨论了如何在Android低版本中兼容使用Optional。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 今天和大家一起使用java8中的Optional API解决nullPointException,
先来看一段代码:


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


    public class Insurance {
        private String name;
        public String getName() {
            return name;
        }
    }


    public class Person {
        private Car car;
        public Car getCar() {
            return car;
        }
    }

    public String getCarInsuranceName(Person p){
        return p.getCar().getInsurance().getName();
    }

这个getCarInsuranceName()方法一看就知道可能有nullPointException
通常我们这样处理:

public String getCarInsuranceName(Person p){
  if(p!=null){
    Car car = p.getCar();
    if(car!=null){
       Insurane insurance = car.getInsurance();
       if(insurance!=null){
          return insurance.getName();
       }
    }
  }
  return "Unknow";
}

好了,我们来看看优雅的程序员:

是看代码不是图

public class Person {
    private Optional<Car> car;
    public Optional<Car> getCar() {
        return car;
    }
}

public class Car {
    private Optional<Insurance> insurance;
    public Optional<Insurance> getInsurance() {
        return insurance;
    }
}

public class Insurance {
    private String name;
    public String getName() {
        return name;
    }
}

 public String getCarInsuranceName(Optional<Person> person) {
        return person.flatMap(Person::getCar)
                     .flatMap(Car::getInsurance)
                     .map(Insurance::getName)
                     .orElse("Unknown");
}

一脸懵逼有没有?好的大王,不管你有没有被征服,反正我是被臣妾是要开始
娓娓道来了。

上面的getCarInsuranceName方法的几个关键点:
1:使用lambda表达式(不会的请恶补上篇文章)
2:使用java.util.Optional对Person类中的Car类和Car类中的Insurance类包装
3:使用java.util.Optional 中流式API处理数据(类似rxjava或者java.util.steam)
官方文档https://docs.oracle.com/javase/8/docs/api/

偷偷的把optional类实例方法截了图


Optional构造函数


1:空值Optional
  Optional<Car> optCar = Optional.empty();
2:非空值Optional,传空抛异常
  Optional<Car> optCar = Optional.of(car);
3:可接受null的Optional
  Optional<Car> optCar = Optional.ofNullable(car);


使用map从Optional中取值和转换值


 Optional<Insurance> optInsurance = Optional.ofNullable(insurance);
 Optional<String> name = optInsurance.map(Insurance::getName);

使用flatMap转换optional


Optional<Car> optCar= person.flatMap(Person::getCar);
Optional<Insurance> = optCar.flatMap(Car::getInsurance)

map和flatMap区别:


Optional<Optional<Car>> car = optPerson.map(Person::getCar);
Optional<Car> car1 = optPerson.flatMap(Person::getCar);

ifPresent:如果值存在就会执行回调,否则什么也不干


optCar.ifPresent(Car::getInsurance);
 


isPresent:值存在返回true,否则false


boolean = optCar.isPresent;

 

orElse:有值则返回,否则返回一个默认值


String name = optCar.map(Insurance::getName)
                     .orElse("Unknown");
 

andThen,再来个filter的例子

    @RequiresApi(api = Build.VERSION_CODES.N)
    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.setProperty("a", "5");
        properties.setProperty("b", "-1");
        properties.setProperty("c", "true");
        System.out.println(readDuration(properties,"a"));
        System.out.println(readDuration(properties,"b"));
        System.out.println(readDuration(properties,"c"));
        OptionalInt.of(1).
    }
    @RequiresApi(api = Build.VERSION_CODES.N)
    public static int readDuration(Properties properties, String name) {
        return Optional.ofNullable(properties.getProperty(name))
                .flatMap(s -> parseString(s))
                .filter(i -> i > 10)
                .orElse(0);
    }

    @RequiresApi(api = Build.VERSION_CODES.N)
    public static  Optional<Integer> parseString(String s) {
        Optional<Integer> optionalInt;
        try {
            optionalInt = Optional.of(Integer.parseInt(s));
        } catch (NumberFormatException e) {
            optionalInt = Optional.empty();
        }
        return optionalInt;
    }

好了,通过上面的这些例子可以帮助我们更优雅的处理nullPointException,祝福各位撸的愉快

兼容低版本(<API 25)


不要担心,宝宝已经帮你完成了,只要下载我打好的jar包
https://download.youkuaiyun.com/download/qq_35599978/10569424  
Optional类由之前导入,java.util.function包替换为导入com.example.rxjavademo.util

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值