Java中Optional使用注意事项

前言

之前遇到过使用Optional之后带来的隐含bug,现在强调记录一下不好的用法,防止错用。

Optional不能序列化,不能作为类的字段(field)

这点尤为重要,即类要纯粹。如果是POJO就原始类型就可以了,如果是领域对象,则更不应该使用Optional作为field。

Optional不能作为方法参数

另一种不太适合使用Optional的情况是将该类型作为方法或者构造函数的参数,这将导致不必要的代码复杂化。

User user = new User("john@gmail.com", "1234", Optional.empty());

相反,使用方法重载(method overloading)来处理非强制性参数要方便得多。

Optional和steam组合更有益处

级联调用是危险的,很容易产生空指针。比如

String isocode = user.getAddress().getCountry().getIsocode().toUpperCase();

在传统做法里,

if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        Country country = address.getCountry();
        if (country != null) {
            String isocode = country.getIsocode();
            if (isocode != null) {
                isocode = isocode.toUpperCase();
            }
        }
    }
}

使用Optional可以精简代码,降低复杂度:

String result = Optional.ofNullable(user)
  .flatMap(User::getAddress)
  .flatMap(Address::getCountry)
  .map(Country::getIsocode)
  .orElse("default");

总结

Optional类对我们最有帮助的一个用例是同Stream或者其他方法组合使用,这些方法会返回一个可构建流畅API的Optional值。如果仅仅作为判空,那么不要使用Optional,直接判null就好。

比如,使用Stream 的Optional对象的例子:

@Test
public void whenGetStream_thenOk() {
    User user = new User("john@gmail.com", "1234");
    List<String> emails = Optional.ofNullable(user)
      .stream()
      .filter(u -> u.getEmail() != null && u.getEmail().contains("@"))
      .map( u -> u.getEmail())
      .collect(Collectors.toList());
   
    assertTrue(emails.size() == 1);
    assertEquals(emails.get(0), user.getEmail());
}

参考

原文链接:https://stackify.com/optional-java/

关于作者:

Eugen是一名软件工程师,对Spring、REST API、安全和教育拥有极大热情。同时,他还是Baeldung(推特账号@baeldung)的创始人。

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据结构与算法

洛谷 P3802 小魔女帕琪

题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼。 帕琪能熟练使用七种属性(金、木、水、火、土、日、月)的魔法,除了能使用这么多种属性魔法外,她还能将两种...

2634
来自专栏aCloudDeveloper

算法导论第十五章 动态规划

      写在前面:从本章开始,算法导论章节进入第四部分:高级设计和分析技术。在读的过程中,可以明显感觉到本章内容跟之前章节的内容要复杂得多。这么来说,之前章...

1795
来自专栏小樱的经验随笔

浅谈我对动态规划的一点理解---大家准备好小板凳,我要开始吹牛皮了~~~

前言 作为一个退役狗跟大家扯这些东西,感觉确实有点。。。但是,针对网上没有一篇文章能够很详细的把动态规划问题说明的很清楚,我决定还是拿出我的全部家当,来跟大家分...

5537
来自专栏斑斓

深入探索Scala的Option

程序员最深恶痛绝并力求避免的异常是NullPointerException,很不幸,我们往往又会忽略这个错误。不知是谁设计了Null这样的对象。我在文章《并非N...

3147

与机器学习算法有关的数据结构

可能你对经常使用的统计分类包中的功能不满足你的需求而感到不爽,或者你已经有了一个新的数据处理方法。所以,你决定改动现有封装好的算法,开始编写你自己的机器学习方法...

2297
来自专栏菩提树下的杨过

“AS3.0高级动画编程”学习:第四章 寻路(AStar/A星/A*)算法 (中)

上一部分提到了节点(Node),代价(Cost),估价公式等基本概念,有了这些知识铺垫 就可以正式开启寻路之旅了! ? 如上图,这是一个5行8列的网格,黄色节点...

2176
来自专栏木子昭的博客

机器学习三剑客之PandasPandas的两大核心数据结构Panda数据读取(以csv为例)数据处理Pandas的分组和聚合(重要)

Pandas是基于Numpy开发出的,专门用于数据分析的开源Python库 Pandas的两大核心数据结构 Series(一维数据) 允许索引重复...

2726
来自专栏数据结构与算法

BZOJ1030: [JSOI2007]文本生成器(AC自动机)

  JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版。该软件可以随机...

612
来自专栏数据结构与算法

poj 2406 Power Strings 周期问题

Power Strings Time Limit: 3000MS Memory Limit: 65536K Total Submissions:...

2625
来自专栏小樱的经验随笔

Codeforces 714A Meeting of Old Friends

A. Meeting of Old Friends time limit per test:1 second memory limit per test:256...

34710

扫描关注云+社区