资讯专栏INFORMATION COLUMN

Java 8 Optional 简介

waltr / 457人阅读

摘要:本文简单介绍中的最常用法。在业务逻辑中使用判断的值是否为空,可以用方法,例如系统属性不存在。标准的用法应该是用方法。如下所示这样的语句比判断简洁的多。不过,这个遗憾在中得到了补足。但同样,设计出来并不是这么用的。

本文简单介绍 Java 8 中 Optional 的最常用法。

创建 Optional

创建 Optional 有三个方法,如下所示:

// 方法1:参数不能为 null,否则会抛出异常
Optional stringOptional = Optional.of("success");  

// 方法2:无法确定参数是否为 null 时,使用这个方法
Optional appNameOptional = Optional.ofNullable(System.getProperty("AppName"));

// 方法3:需要返回一个不含值的 Optional 对象时,使用这个方法
Optional emptyOptional = Optional.empty();
注意:Optional 对象的值是不可修改的。
在业务逻辑中使用 Optional

判断 Optional 的值是否为空,可以用 isPresent() 方法,例如:

Optional appNameOptional = 
        Optional.ofNullable(System.getProperty("AppName"));
        
if (!appNameOptional.isPresent()) {
    System.out.println("系统属性 AppName 不存在。");
}

Optional 设计出来并不是这么用的。标准的用法应该是用 ifPresent() 方法。如下所示:

Optional.ofNullable(System.getProperty("AppName"))
        .ifPresent(appname -> System.out.println("AppName = " + appname));

这样的语句比 if 判断简洁的多。

Java 8 的 Optional 类并没有 ifNotPresent() 这样的方法。不过,这个遗憾 在 Java 9 中得到了补足。

从 Optional 对象取值

最简单的取值方法就是 get() 方法了,不用什么例子就看得懂。但同样,Optional 设计出来并不是这么用的。Optional 有更好的取值方法 orElse()orElseGet(),它们甚至用来代替 if 语句:

// 当系统属性 AppName 不存在时,返回 "DefaultAppName"
String appName = Optional
        .ofNullable(System.getProperty("AppName"))
        .orElse("DefaultAppName");
        
// 当缺省值需要调用另外的方法获得时,可以这样实现
String appName = Optional
        .ofNullable(System.getProperty("AppName"))
        .orElseGet(() -> getFromOtherPlace());

此外如果你希望 Optional 为空时抛出异常,可以用 orElseThrow() 方法:

String appName = Optional
        .ofNullable(System.getProperty("AppName"))
        .orElseThrow(() -> new IllegalStateException("AppName is empty"));
生成新的 Optional

前面提到 Optional 的值是不可以改的,但如果当前 Optional 对象的内容不是我想要的怎么办? Optional 提供了几个方便的方法,如下所示:

// map() 方法根据当前 Optional 的值生成一个新的 Optional
Optional message = Optional
        .ofNullable(System.getProperty("AppName"))
        .map(appname -> "App name is " + appname);
        
// filter() 方法检查 Optional 的值是否满足条件,如果
// 满足则返回自身,否则返回 Optional.empty()
Optional message = Optional
        .ofNullable(System.getProperty("AppName"))
        .filter(appname -> appname.length() > 0);
综合示例:

下面是一个没有用 Optional 的例子:

List searchResults = Collections.emptyList();
String keyword = parameters.get("keyword");

if (keyword != null) {
    String fixedKeyword = "%" + keyword.toUpperCase() + "%";
    searchResults = search(fixedKeyword);
}

System.out.println("搜索结果:" + searchResults.size() + " 个");

用了 Optional 之后:

List searchResults = Optional
        .ofNullable(parameters.get("keyword"))
        .map(keyword -> "%" + keyword.toUpperCase() + "%")
        .map(fixedKeyword -> search(fixedKeyword))
        .orElse(Collections.emptyList());

System.out.println("搜索结果:" + searchResults.size() + " 个");

当然,上面这个例子中,两个 map() 方法可以写在一起,这个可以根据自己的喜好来了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70120.html

相关文章

  • Java 8 新特性之Optional

    摘要:概述简介类是一个容器类,代表一个值存在或不存在,原来用表示一个值不存在,现在可以更好的表达这个概念,并且可以避免空指针异常。否则返回字符串长度为与类似,要求返回值必须是字符串长度为本文首发于凌风博客新特性之类作者凌风 1. 概述 1.1 简介 Optional 类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Op...

    Little_XM 评论0 收藏0
  • java 8 实战》读书笔记 -第五章 使用流

    摘要:比如,你可以建立一个,选出热量超过卡路里的头三道菜请注意也可以用在无序流上,比如源是一个。跳过元素流还支持方法,返回一个扔掉了前个元素的流。一般来说,应该使用来对这种流加以限制,以避免打印无穷多个值。 一、筛选和切片 1.用谓词筛选 Streams接口支持filter方法。该操作会接受一个谓词(一个返回boolean的函数)作为参数,并返回一个包括所有符合谓词的元素的流。例如筛选出所有...

    Richard_Gao 评论0 收藏0
  • Java8学习小记

    摘要:但有一个限制它们不能修改定义的方法的局部变量的内容。如前所述,这种限制存在的原因在于局部变量保存在栈上,并且隐式表示它们仅限于其所在线程。 2014年,Oracle发布了Java8新版本。对于Java来说,这显然是一个具有里程碑意义的版本。尤其是那函数式编程的功能,避开了Java那烦琐的语法所带来的麻烦。 这可以算是一篇Java8的学习笔记。将Java8一些常见的一些特性作了一个概要的...

    CHENGKANG 评论0 收藏0
  • Java 8 新特性之Stream API

    摘要:简而言之,提供了一种高效且易于使用的处理数据的方式。和以前的操作不同,操作还有两个基础的特征中间操作都会返回流对象本身。注意自己不会存储元素不会改变源对象,相反,它们会返回一个持有结果的新操作时延迟执行的。为集合创建并行流。 1. 概述 1.1 简介 Java 8 中有两大最为重要的改革,第一个是 Lambda 表达式,另外一个则是 Stream API(java.util.strea...

    cooxer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<