Java8新特性——Optional

作者: 哈皮呀 | 来源:发表于2019-07-15 22:17 被阅读301次

前言

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

原创声明

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

Optional方法列表

Optional的方法列表如下:

image

初始化

初始化一个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只会这么用:

image

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

ifPresent

如果存在,则做某事

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

image

orElse

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

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

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";
}
image

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等视频资料

关注Happyjava公众号

相关文章

  • JAVA8新特性-Optional类解决NPE问题

    ** JAVA8新特性-Optional类解决NPE问题** API介绍 1、Optional(T value),...

  • java8 - optional

    optional 是java8的新特性,The purpose of the class is to provid...

  • Optional源码分析(未完)

    Optional源码分析(未完) Optional 类是Java8的新特性,Optional是一个可以为null的...

  • JAVA8- Optional-用法浅析

    JAVA8- Optional-用法浅析 简介 java8新引入optional特性,官方说法是更优雅的处理空指针...

  • Java-8-Optional类

    Java-8-Optional类 java8新特性之Optional类 空指针异常是一个运行时异常,对于这一类异常...

  • Java8新特性——Optional

    前言 在开发中,我们常常需要对一个引用进行判空以防止空指针异常的出现。Java8引入了Optional类,为的就是...

  • 关于java8在android中使用

    java8的新特性,能使用到android中的Lambda表达式、方法引用;像获取反射参数名字、Optional、...

  • java8Optional

    最近用java8新特性optional遇到里面有2个方法,map和flatMap,特此记录 1、map中获取的返回...

  • 2019-11-28

    今天使用java8的新特性Optional 踩了个坑,例子如下:在orElseThrow方法中我想打印日志,所以t...

  • Java8新特性—Optional类

    Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用ge...

网友评论

    本文标题:Java8新特性——Optional

    本文链接:https://www.haomeiwen.com/subject/wtfakctx.html