【问题标题】:mulitple Optional parameters, Optional<List<Object>> vs List<Optional<Object>>, Java 8多个可选参数,Optional<List<Object>> vs List<Optional<Object>>,Java 8
【发布时间】:2019-07-03 02:22:31
【问题描述】:

我是新手,想多了解一点必须如何使用Optional

public class UsingOptional {

  public static void main(String... args) {
    multipleOptional(null, null);
  }

  public static void multipleOptional(Optional<String> string1, Optional<Integer> string2) {
    string1.ifPresent(s -> System.out.println("string1:" + s));
    string2.ifPresent(s -> System.out.println("string2:" + s));
  }

}

为什么我不能这样做multipleOptional(null, null);

调用multipleOptional方法的正确方法是什么?

Optional&lt;List&lt;String&gt;&gt;List&lt;Optional&lt;String&gt;&gt; 之间有什么区别(我必须考虑的因素)?

【问题讨论】:

  • multipleOptional(null, null); // Why I can't to do this?:你可以这样做(虽然那会很糟糕,null 值在 Optional 类型的方法参数之上)

标签: list java-8 optional


【解决方案1】:

首先,重要的是要认识到拥有 Optional 变量的全部意义在于避免出现空值,因此必须检查空值。毕竟,如果您必须在每次使用 Optional 变量时检查它是否为 null,那么首先拥有/使用 Optional 是毫无意义的。

换句话说,Optional 变量永远不应该为 null - 即,它永远不应该被初始化为 null,永远不会被分配 null 的值,并且任何/所有返回 Optional 值的方法都永远不应该返回 null .在所有这些情况下,应该使用 Optional.empty() 代替。

因此,通过遵守此合同,Optional 强制您始终明确处理数据不存在的情况,而不必担心 NullPointerExceptions。

如果您习惯了 Optionals,那么我建议不要使用字符串,而是使用“getter”创建自己的类(Optional&lt;Employee&gt; 等),如果在 null 上调用会抛出 NPE。根据您的示例,使用字符串很容易不对其调用方法,因此不会经历促使引入 Optional 的痛苦。

为什么我不能这样做 multipleOptional(null, null); ?

当然,该语言允许您这样做,尽管它打破了我刚才所说的关于 Optional 的隐含契约。违反这个契约的直接结果是你会在ifPresent 调用上得到一个 NullPointerException。

调用multipleOptional方法的正确方法是什么?

通过使用“可选”! Optionals 的两个最常见的来源(除了您自己的代码)是 Streams 和数据库访问,其中返回单个结果(但库不能假设实际上会有结果)。例如,您的代码可以如下调用:

Optional<String> name1 = employees.stream().filter(e -> e.getOffice() == 1234).findFirst().map(Employee::getName);

Optional<String> name2 = nameRepository.findById(1234);

multipleOptional(name1, name2);

请注意,即使没有找到员工或姓名,此代码也将正常工作。

Optional&lt;List&lt;String&gt;&gt;List&lt;Optional&lt;String&gt;&gt; 之间有什么区别(我必须考虑的因素)?

就个人而言,我认为两者都毫无意义。如上所述,当检索可能存在或可能不存在的单个结果时,通常使用 Optionals。因此,它们通常不与列表一起使用 - 毕竟,如果结果不存在,那么您就不会在列表中包含它(例如,如果发生编码为返回对象列表的查询返回零行,那么您只会得到一个空列表 - 无需担心 Optionals)。

因此,我认为我以前从未见过 Optional&lt;List&lt;&gt;&gt; - 再一次,空列表无法很好地处理任何结果。

同样,第二个应该是你有一个字符串列表的地方,每个字符串可能存在也可能不存在(或者在没有 Optionals 的情况下为 null)。同样,如果该值不存在,那么它可能一开始就不应该被添加到列表中。

【讨论】:

    猜你喜欢
    • 2021-06-10
    • 2019-07-20
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多