Java中Optional使用注意事项

简介: 前言之前遇到过使用Optional之后带来的隐含bug,现在强调记录一下不好的用法,防止错用。Optional不能序列化,不能作为类的字段(field)这点尤为重要,即类要纯粹。如果是POJO就原始类型就可以了,如果是领域对象,则更不应该使用Optional作为field。

i18n

前言

之前遇到过使用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)的创始人。





唯有不断学习方能改变! -- Ryan Miao
目录
相关文章
|
1天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
16 3
|
18天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
1月前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
2月前
|
Java
Java8 Optional
Java8 Optional
12 0
|
2月前
|
安全 Java 开发者
Java 8 `Optional` 类的用法和优势
【2月更文挑战第15天】
15 0
|
2月前
|
存储 Java
java8新特性-Optional
java8新特性-Optional
18 0
|
3月前
|
JSON 安全 Java
JAVA8实战 - Optional工具类
JAVA8实战 - Optional工具类
85 0
|
4月前
|
安全 Java 程序员
Dating Java8系列之巧用Optional之优雅规避NPE问题
Dating Java8系列之巧用Optional之优雅规避NPE问题
28 0
|
4月前
|
架构师 Java 测试技术
Java 编程问题:十二、`Optional`
Java 编程问题:十二、`Optional`
44 0
|
4月前
|
Java 程序员 容器
Java8新特性 Optional类
Java8新特性 Optional类
27 0