java8系列03——Optional类

本文介绍了Java8中的Optional类,旨在避免空指针异常,提高代码的健壮性和可读性。通过示例代码展示了Optional的创建、安全消费值、获取值、过滤、判断、数据转换等方法的使用,并探讨了在实际开发中如何更好地集成Optional到项目中,以提升代码质量。
摘要由CSDN通过智能技术生成

Optional

1 概述

参考如下代码。

private static void test27() {
   Author author = getAuthor();
    System.out.println(author.getName());
}

private static Author getAuthor() {
    new Author(3L, "cc", 17, "小米最棒", null);
    return null;
}

报错NullPointerException。在实际工作中,如果持久层中存储了一些对象数据,取出时不做判空操作就可能出现空指针异常。

判空的对象如果很多,代码容易疏漏,也不优雅。

 private static void test27() {
       Author author = getAuthor();
       if (author!=null) {
           System.out.println(author.getName());
       }
    }

因此,为了避免出现空指针异常,java8设计了Optional类.

2 使用
2.1 创建
 private static void test28() {
    Author author= getAuthor();
    Optional<Author> authorOptional = Optional.ofNullable(author);
	authorOptional.ifPresent(author1 -> System.out.println(author1.getName()));
}

不过这样的代码似乎也不简洁呀。实际上,我们会这么用。

 private static Optional<Author> getAuthor() {
       Author author = new Author(3L, "cc", 17, "小米最棒", null);
       return  Optional.ofNullable(author);
 }

private static void test28() {
        getAuthor().ifPresent(author1 -> System.out.println(author1.getName()));
}    

养成使用Optional的习惯以后,就不用记忆哪个类需要非空判断了。而且生产中一些框架,如mybatis3.5+会帮我们完成数据封装的步骤,我们只需要直接使用。

还可以Optional.of()方法创建对象,但是这还是可能出现空指针异常,不推荐。

2.2 安全的消费值

前面的ifpresent就可以安全的消费值。

private static void test28() {
        getAuthor().ifPresent(author1 -> System.out.println(author1.getName()));
}    
2.3 安全的获取值

运行如下代码。

    private static void test29() {
        getAuthor().get();
    }
    
    private static Optional<Author> getAuthor() {
        return  Optional.ofNullable(null);
    }

报错:java.util.NoSuchElementException: No value present。使用OrElseGet可以设置无数据时返回的默认值。

  private static void test29() {
        getAuthor().orElseGet(() -> new Author());
    }

当然,也可以使用OrElseThrow在得不到值抛出异常,进行统一处理等。

  private static void test30() {
        try {
            getAuthor().orElseThrow(() -> new RuntimeException("老哥你没有值啊!"));
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
2.4 过滤

Optinal对象的过滤与流的过滤特别类似。

private static void test31() {
    Optional<Author> authorOptional = getAuthor().filter(author -> author.getAge() > 15);
    authorOptional.ifPresent(System.out::println);
}
2.5 判断
 private static void test32() {
        Optional<Author> author = getAuthor();
        if(author.isPresent()) {
            System.out.println(author.get().getName());
        }
    }

更推荐使用ifPresent.

2.6 数据转换

使用map(),与Stream流很类似。

 private static void test33() {
        Optional<String> name = getAuthor().map(author -> author.getName());
        name.ifPresent(System.out::println);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半旧518

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值