3.5 Optional类

1.简介
Optional类位于java.util包下,是一个可以为 null 的容器对象,如果值存在则isPresent()方法会返回 true ,调用 get() 方法会返回该对象,可以有效避免空指针异常。

2.创建

public class CreateOptional {
    public static void main(String[] args) {
    	//创建一个StringBuilder对象
        StringBuilder stringBuilder = new StringBuilder("我是一个字符串");

        //1.使用Optional.ofNullable(T t)方法,创建Optional对象,注意t允许为空
        StringBuilder nullStringBuilder = null;
        Optional<StringBuilder> stringBuilderOptional = Optional.ofNullable(nullStringBuilder);
        System.out.println(stringBuilderOptional);
        
        //2.使用Optional.of(T t)方法,创建Optional对象,注意T不能为空
        Optional<StringBuilder> stringBuilderOptional2 = Optional.of(stringBuilder);
        System.out.println(stringBuilderOptional2);

        //3.使用Optional.empty()方法,创建一个空的Optional对象:
        Optional<Object> empty = Optional.empty();
        System.out.println(empty);
    }
}

3.常用方法
(1).抛空指针异常

public class OptionalMethods {
    @ToString
    @AllArgsConstructor
    @Data
    static class Category {
        private String name;
    }

    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    static class Goods {
        private String name;

        private Category category;
    }

    /**
     * 获取商品的分类名称
     * @param goods 商品
     * @return 分类名称
     */
    static String getGoodsCategoryName(Goods goods) {
        return goods.getCategory().getName();
    }

    public static void main(String[] args) {
        //实例化一个商品类
        Goods goods = new Goods();
        //获取商品的分类名称
        String categoryName = getGoodsCategoryName(goods);
        System.out.println(categoryName);
    }
}
Exception in thread "main" java.lang.NullPointerException
	at com.example.demo.OptionalMethods.getGoodsCategoryName(OptionalMethods.java:32)
	at com.example.demo.OptionalMethods.main(OptionalMethods.java:39)

实例中,由于在实例化Goods类时,没有给其下面的Category类型的category属性赋值,它就为 null,在运行时,null.getName()就会抛出空指针异常。同理,如果goods实例为null,那么null.getCategory()也会抛出空指针异常。

(2).优化

static String getGoodsCategoryName(Goods goods) {
    if (goods != null) {
        Category category = goods.getCategory();
        if (category != null) {
            return category.getName();
        }
    }
    return "该商品无分类";
}

(3).引入Optional类解决空指针异常

public class OptionalMethods {
    @ToString
    @AllArgsConstructor
    @Data
    static class Category {
        private String name;
    }

    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Data
    static class Goods {
        private String name;

        private Category category;
    }

    /**
     * 获取商品的分类名称
     *
     * @param goods 商品
     * @return 分类名称
     */
    static String getGoodsCategoryName(Goods goods) {
        //将商品实例包装入Optional类,创建Optional<Goods>对象
        Optional<Goods> goodsOptional = Optional.ofNullable(goods);
        //如果有值则将其返回,否则返回指定的默认对象
        Goods defaultGoods = goodsOptional.orElse(new Goods("默认商品", new Category("默认分类")));
        //此时defaultGoods一定是非空,不会产生空指针异常
        Category category = defaultGoods.getCategory();

        //将分类实例包装入Optional类,创建Optional<Category>对象
        Optional<Category> categoryOptional = Optional.ofNullable(category);
        //如果有值则将其返回,否则返回指定的默认对象
        Category defaultCategory = categoryOptional.orElse(new Category("默认分类"));
        //此时defaultCategory一定是非空,不会产生空指针异常
        return defaultCategory.getName();
    }

    public static void main(String[] args) {
        //实例化一个商品类
        Goods goods = new Goods();
        //获取商品的分类名称
        String categoryName = getGoodsCategoryName(goods);
        System.out.println(categoryName);
    }
}

实例中,使用Optional类的ofNullable(T t)方法分别包装了goods对象及其级联属性category对象,允许对象为空,然后又调用了其ofElse(T t)方法保证了对象一定非空。这样,空指针异常就被优雅地规避了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OptionalJava 8中引入的一个用于解决空指针异常问题的容器。它可以包含一个非空的值,也可以表示为空。Optional的设计目的是为了避免在代码中频繁使用null值,从而提高代码的可读性和健壮性。 使用Optional可以有效地处理可能为空的值,避免出现NullPointerException。它提供了一系列方法来判断Optional对象是否包含值,如果有值则可以通过get()方法获取该值,或者使用orElse()方法指定一个默认值。 下面是一个示例代码,演示了如何使用Optional: ```java Optional<String> optionalValue = Optional.of("Hello World"); if (optionalValue.isPresent()) { String value = optionalValue.get(); System.out.println(value); } else { System.out.println("Value is absent"); } String defaultValue = optionalValue.orElse("Default Value"); System.out.println(defaultValue); ``` 在上面的代码中,我们首先使用`Optional.of()`方法创建了一个包含非空值的Optional对象。然后通过`isPresent()`方法判断Optional对象是否包含值,如果有值则通过`get()`方法获取该值并输出。如果Optional对象为空,则输出"Value is absent"。 接下来使用`orElse()`方法指定了一个默认值,并输出该默认值。如果Optional对象包含值,则输出原始值;如果Optional对象为空,则输出指定的默认值。 使用Optional可以有效地避免空指针异常,并提高代码的可读性和健壮性。它在编写Java代码时是一个非常有用的工具。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值