【问题标题】:Java 8 Optionals, Combining StatementsJava 8 可选,组合语句
【发布时间】:2020-11-28 06:35:36
【问题描述】:

我是 Java 8 可选项的新手,我想知道是否有办法将这两个语句合并为一个同时保留可选项?

public List<String> getEmployeeStreetNames(Employee employee){
     List<Addresses> addresses = Optional.ofNullable(employee)
     .map(Employee::getAddresses)
      .orElse(new ArrayList<>());

   return addresses.stream()
       .map(Address::getStreetName)
       .collect(Collectors.toList())
}

非常感谢任何帮助。

【问题讨论】:

  • 我要注意的一点是,在这种情况下,我不会使用Optional.ofNullable,也可能根本不会使用Optional。我只想说“你不能在一个空员工身上调用这个,愚蠢的”然后让 NPE 发生;如果employee.addresses 不允许为空(例如,您使用可以为空但不能为空的合理规则),那么您可以简单地在employee.getAddresses().stream() 上开始整个业务。
  • @chrslis-cautiouslyoptimistic 我建议您回答您的明智评论,

标签: java optimization java-8 optional simplify


【解决方案1】:

首先,避免在“可能”的管道步骤中创建新对象,例如orElse;即使未使用,您也总是会产生创建参数的开销。更喜欢Supplier&lt;T&gt; 之类的签名,或者在本例中为Collections.emptyList()。 (这对于异常尤其很重要;始终使用MyException::new() -&gt; new MyException(foo)。)

在这种情况下,有几种方法可以处理管道,嵌套或连续。

return Optional.ofNullable(employee)
    .map(Employee::getAddresses)
    .map(a -> a.stream().map(Address::getStreetName).collect(toList()))
    .orElse(emptyList());

return Optional.ofNullable(employee)
    .map(Employee::getAddresses)
    .orElse(emptyList())
    .stream()
    .map(Address::getStreetName)
    .collect(toList());

我通常会使用嵌套版本,因为嵌套管道一点也不难理解。

【讨论】:

  • 非常感谢!我真的很感激:)
  • 或使用 Java 9:Stream.ofNullable(employee) .flatMap(e -&gt; e.getAddresses().stream()) .map(Address::getStreetName) .collect(toList());(假设 getAddresses() 永远不会返回 null)。
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多