【问题标题】:Providing an Empty List to an Optional?提供一个空列表给一个可选的?
【发布时间】:2020-06-27 15:29:25
【问题描述】:

假设我有这样的布局:

public void caller(@NonNull List<Integer> param){
  // param COULD BE EMPTY, but it CANNOT be NULL, its not nullable
  if(!param.isEmpty()) function(Optional.of(param));
  // If param is empty then just dont call "function"
}


public void function(Optional<List<Integer>> someParam){
  someParam.ifPresent(...);
}

问题来了:基于空列表创建Optional 的用法不正确吗?我的困惑是我们是否应该提供 Optional 无论caller 中的param 是否为空,因为它不为空,但我想知道这是否是正确的用法?

【问题讨论】:

  • 如果 param 不能为空,我看不出将其包装在 Optional 中的意义。
  • Optional 主要旨在为方法提供一种清晰的方式来表示它们可能会返回 null 结果作为其签名的一部分。任何时候你将它用于其他目的时,问问自己是否有令人信服的理由使用它。如果你想不出一个,你就不应该使用它。在这种情况下,我看不到一个。
  • 大多数时候,OptionalCollectionListSet 等)子类型不应一起使用,因为空集合几乎总是具有相同的语义作为一个空的可选项。
  • 空状态太多:someParam 可能是nullOptionial.empty()Optional.of(List.of())

标签: java oop if-statement functional-programming optional


【解决方案1】:
  1. someParam.ifPresent(...); ifPresent 的主体总是被调用,因为总是有一个元素,即使它是一个空列表(你正在检查空值 @NonNull List&lt;Integer&gt; param)。
  2. 您使用的是Optional.of 而不是Optional.ofNullable,因此总会有一个非空元素。
  3. Optional 中的包装列表没有多大意义,为什么不传递一个空列表而不处理任何元素?
  4. if(!param.isEmpty()) 是多余的,因为你知道列表中有元素,如 3 所述。为什么不传递列表进行处理?

tl;dr:您将空列表与null 混合在一起,将任何集合包装在Optional 中没有多大意义。

【讨论】:

    猜你喜欢
    • 2011-08-09
    • 1970-01-01
    • 2021-09-03
    • 2019-02-22
    • 2021-09-28
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多