java8如何使用Optional

一、概述

现在使用Java 8已有很长时间,我对新的API更改感到非常满意。我仍然不知道的一个知识点是什么时候使用Optional我似乎在想要在可能存在的null的任何地方都使用它

我似乎可以在许多情况下使用它,但我不确定它是否会带来好处(可读性/null安全性)或仅仅是造成额外的开销。

1-作为方法可以返回时的公共方法返回类型null

public Optional findFoo(String id);

2-作为参数的方法参数时,参数可能是null

public Foo doSomething(String id, Optional barOptional);

3-作为bean的可选成员:

public class Book {

  private List pages;
  private Optional index;

}

4-在Collections

总的来说,我不认为:

List>

添加任何东西-尤其是因为可以filter()删除null值等,但是Optionalin集合有什么好的用处吗?

二、详解

Optional的要点是为函数返回值提供一种手段,以指示不存在返回值。

这与OP问题中的用例#1最接近虽然,缺少值更为精确,因为类似这样的IntStream.findFirst值永远不会返回null。

对于用例2,将可选参数传递给方法,可以使之起作用,但这相当笨拙。假设您有一个方法,该方法接受一个字符串,然后是一个可选的第二个字符串。接受Optionalas作为第二个arg将导致如下代码:

foo("bar", Optional.of("baz"));
foo("bar", Optional.empty());

甚至接受null也会更好:

foo("bar", "baz");
foo("bar", null);

最好的办法是拥有一个重载的方法,该方法接受单个字符串参数并为第二个提供默认值:

foo("bar", "baz");
foo("bar");

这确实有局限性,但是比以上任何一个都好。

在类字段或数据结构中具有的用例#3#4Optional被视为对API的滥用。首先,它违反Optional了顶部所述的主要设计目标其次,它不会增加任何价值。

可以使用三种方法来处理缺少值的情况Optional:提供替代值,调用函数以提供替代值或引发异常。如果要存储到字段中,则可以在初始化或分配时执行此操作。如果要将值添加到列表中(如OP所述),则可以选择不添加值,从而“拉平”缺少的值。

我确信有人可以提出一些他们确实想Optional在字段或集合中存储的人为设计的案例,但是总的来说,最好避免这样做。

如若转载,请注明出处:https://www.javaidea.cn/article/8296.html

(0)
上一篇 2022年2月7日 上午10:03
下一篇 2022年2月7日 上午10:03

相关推荐

发表评论

您的电子邮箱地址不会被公开。