专栏首页Happy的分享Java8新特性——Optional

Java8新特性——Optional

前言

在开发中,我们常常需要对一个引用进行判空以防止空指针异常的出现。Java8引入了Optional类,为的就是优雅地处理判空等问题。现在也有很多类库在使用Optional封装返回值,比如Spring Data JPA等。下面,我们就来了解下Optional的常用用法

原创声明

本文发布于掘金号【Happyjava】。Happy的掘金地址:juejin.im/user/5cc289…,Happy的个人博客:(blog.happyjava.cn)[blog.happyjava.cn]。欢迎转载,但须保留此段声明。

Optional方法列表

Optional的方法列表如下:

初始化

初始化一个Optional有三种方式,如下:

// 创建一个空的optional
Optional<Object> empty = Optional.empty();
// 此方式不可为null
Optional<String> optional = Optional.of("Happyjava");
// 此方式可以为null
Optional<Object> optional1 = Optional.ofNullable(null);
复制代码

这里需要注意一点,Optional.of初始化一个Optional,是不可以传null值进去的,否则会报空指针异常。

Optional初级用法

很多人对于Optional只会这么用:

通过isPresent方法判断是否有值,然后通过get方法获取值。虽然这么写没有什么问题,但始终是没用到Optional的精华。

ifPresent

如果存在,则做某事

上面那种写法,我们完全可以用ifPresent来替换:

orElse

如果存在,则返回。如果不存在,则提供默认值。我们可以通过orElse方法的入参设置默认值

@Test
public void testOrElse() {
    Optional<Object> optional = Optional.empty();
    Object happyjava = optional.orElse("Happyjava");
    System.out.println(happyjava);
}

orElseGet

如果存在,则返回。如果不存在,则由函数来创造值

@Test
public void orElseGetTest() {
    Optional<Object> optional = Optional.empty();
    Object name = optional.orElseGet(this::getName);
    System.out.println(name);
}

public String getName() {
    return "Happyjava";
}

orElseThrow(常用)

如果存在,则返回。不存在,则抛出异常。

在业务开发的时候,经常会对一个引用进行判空,如果为空,则采用异常流的形式处理业务逻辑。常见代码如下:

@Test
public void testTest() {
    User user = userRepo.findById(1);
    if(user ==null){
        throw new WebException("用户不存在");
    }
    // 继续业务逻辑
}
复制代码

如果采用Optional的话,可以这么写:

@Test
public void testElseThrow() {
    Optional<Object> optional = Optional.empty();
    Object o = optional.orElseThrow(() -> {
        throw new RuntimeException("xxx不存在");
    });
}
复制代码

这段代码,在JDK8中是编译不过的,会提示有受检异常未处理。搜索了下,这似乎是JDK的bug。我演示用的是JDK11。

map

map方法用来返回一个新的Optional,也可以说用来组装一个新的Optional。

如:

Optional<String> name = Optional.of("Happyjava");
Optional<String> upperName = name.map((value) -> value.toUpperCase());
System.out.println(upperName.orElse("No value found"));
复制代码

flatMap

flatMap也是返回一个Optional。其与map的区别在于:map是把结果自动封装成一个Optional,但是flatmap需要你自己去封装。

Optional<String> name = Optional.of("Happyjava");
Optional<String> opt = name.flatMap(e -> Optional.of(e.toLowerCase()));
System.out.println(opt.orElse("No value found"));
复制代码

filter

如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。

Optional<String> optional = Optional.of("Happyjava");
Optional<String> opt = optional.filter(s -> {
    return s.length() > 9;
});
System.out.println(opt.orElse("empty"));
复制代码

此代码会输出empty

总结

Optional是Java8引入的特性,不见得我们会把自己的方法返回值封装成Optional,但是学习Optional还是很有必要的,比如Spring Data JPA框架现在把返回结果封装成Optional的形式。

关注公众号领资料

搜索公众号【Happyjava】,回复【电子书】和【视频】,即可获取大量优质电子书和大数据、kafka、nginx、MySQL等视频资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【快学springboot】3.多种接受参数的方式

    在开发中,我们常常会碰到多种传参的方式。这里,我们就来总结下,springboot中可以运用到的接受参数的方式。

    Happyjava
  • 【快学springboot】1.快速创建springboot项目

    IDEA专业版默认集成了此工具,eclipse或者vs code等可以自行搜索安装。如果不希望安装此插件,也可直接通过官网创建spring boot项目,然后下...

    Happyjava
  • 【快学Docker】快速创建容器,容器常用命令

    容器是Docker的三大核心概念之一。简单地说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运...

    Happyjava
  • 厌倦了空指针异常?考虑使用Java SE 8的Optional!

    一个聪明的人曾经表示,在处理空指针异常之前,你不是一个真正的Java程序员。开玩笑,空引用是许多问题的根源,因为它通常用于表示没有值。Java SE 8引入了一...

    IT小马哥
  • Java8新特性之空指针异常的克星Optional类

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    用户1161110
  • 使用 Java 8 Optional 的正确姿势

    我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPoi...

    哲洛不闹
  • 使用Optional摆脱NPE的折磨

    architectural-architectural-design-architecture

    阿杜
  • Java 是如何优雅地处理NPE问题的

    对于 Java 开发者来说,null 是一个令人头疼的类型,一不小心就会发生 NPE (空指针) 问题。也是 Java 语言为人诟病的一个重要原因之一。在我们消...

    码农小胖哥
  • Jdk14都要出了,还不能使用 Optional优雅的处理空指针?

    空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 NullPointException。这是你可能会...

    未读代码
  • Java 8中的Optional 类型与 Kotlin 中的可空类型Java 8中的Optional 类型与 Kotlin 中的可空类型Kotlin 中的可空类型《Kotlin极简教程》正式上架:

    其中,我们使用 String? 同样表达了 Optional<String>的意思,相比之下,哪个更简单?

    一个会写诗的程序员

扫码关注云+社区

领取腾讯云代金券