Java 8新特性之Optional取代null(3)

public static Optional<Insurance> getInsuranceOpt(Optional<Person> person,Optional<Car> car){
        if(person.isPresent() && car.isPresent()){
            return Optional.of(getInsurance(person.get(),car.get()));
        }
        return Optional.empty();
    }

Java 8新特性之Optional取代null

这看起来好了很多,更优雅的方式:

public static Optional<Insurance> getInsuranceOpt1(Optional<Person> person, Optional<Car> car) {
        return person.flatMap(p -> car.map(c -> getInsurance(p, c)));
    }

如果p为空,不会执行返回空的Optional对象。如果car为空也不会执行 返回空Optional对象。 如果都有值那么调用这个方法。

filter剔除特定的值

  除了map和flatMap方法类似流中的操作,还有filter方法。使用filter可以快速判断Optional对象中是否包含指定的规则,如:

Insurance insurance = new Insurance();
if(insurance != null && insurance.getName().equals("abc")){
    System.out.println("is abc");
}

可以使用filter改写为:

Optional<Insurance> insuranceOpt = Optional.of(insurance);
insuranceOpt.filter(c->c.getName().equals("abc")).ifPresent(x->System.out.println(x));

用Optional改善你的代码

  我们虽然很难对老的Java API进行改动,但是可以再自己的代码中添加一些工具方法,来修复或者绕过这些问题,容纳给你的代码享有Optional带来的威力。

使用Optional封装可能为null的值

  现存的Java API几乎都是通过返回一个null的方式来表示需要值的缺失,或者由于某些原因计算无法得到该值。比如,如果Map中不含指定的键对应的值,它的get就会返回一个null。我们想在这种情况下返回Optional对象是很容易的。

Object value = new HashMap<String,Object>().get("key"); //null

有两种方式转换为Optional对象,第一种就是if else 方式,显然很笨重。第二种就是使用ofNullable方法。

Optional<Object> value = Optional.ofNullable(new HashMap<String,Object>().get("key"));

每次你希望安全的对潜在为null的对象进行转换时,都可以先将其转换为Optional对象。

异常与Optional

  由于某种原因,函数无法返回某个值,这时除了返回null,还会抛出一个异常。典型的例子是Integer.parseInt(String),将String转换为int。如果String无法解析为整型,就会抛出NumberFormatException异常。一般做这个操作,我们会加入 try/catch来避免程序挂掉,而不是用if来判断。

  使用Optional对象对遭遇无法转换的String返回非法值进行建模,这时你期望parseInt的返回值是一个optional。虽然我们无法改变以前的方法,但我们可以创建一个工具方法:

public static Optional<Integer> StringToInt(String s){
        try{
            return Optional.of(Integer.parseInt(s));
        }catch (Exception ex){
            return Optional.empty();
        }
    }

我们可以建立一个OptionalUtils工具类,然后对所有的类似转换操作创建方法。然后在需要的地方 OptionalUtils.StringToInt(Stirng);

基础类型的Optional对象

  与Stream对象一样,Optional对象也提供了类似的基础类型:OptionalInt、OptionalDouble、OptionalLong。 但是这三个基础类型不支持map、flatMap、filter方法。

小结:

  1.null引用在历史上被引入到程序设计语言中,目的是为了表示变量值的缺失。

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

  3.你可以使用静态工厂方法Optional.empty、Optional.of、Optional.ofNullable创建Optional对象。

  4.Optional支持多种方法,比如map、flatMap、filter,他们在概念上与Stream类似。

  5.使用Optional会迫使你更积极的引用Optional对象,以及应对变量缺失的问题,最终你能更有效的防治代码中出现空指针异常。

  6.使用Optional能帮助你更好的设计API,用户只需要参阅签名酒知道该方法是否接受一个Optional。

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/45f2a80f5167657b9aabc74f53c43b42.html