【问题标题】:Optional::isPresentOrElse -> List<> analog可选::ifPresentOrElse -> 列表<> 模拟
【发布时间】:2021-10-14 04:12:26
【问题描述】:

面对一些有趣的问题:例如,我必须选择一些解决方案,这取决于我的List&lt;&gt;是否为空白,但出于重构原因我不想使用简单的if-statement(例如,有三个丑陋的内部 if-s)。如果我有一个可为空的对象,我可以使用Optional::ifPresentOrElse 解决方案,但是如果数组不是空的而只是空的怎么办?有没有内置的语言解决方案?我知道我可以写ListOptional 之类的东西,在那里创建我自己的ListOptional::isNotEmptyOrElse,但也许还有其他解决方案?

【问题讨论】:

  • 请显示一些代码和/或输入和所需输出的示例。

标签: java list java-8 java-stream optional


【解决方案1】:

Optional 理解为对可能的null instance 提供可链接的空安全方法的包装器。建议的 ListOptional 对我来说没有任何意义,因为 null 和空列表在语义上表示相同 - 一堆什么都没有。

如果要使用Optional,则必须过滤其中的单个列表是否为空并提供替代方案:

List<String> nonEmpty = Optional.of(list)
    .filter(l -> !l.isEmpty())                     // is the list empty?
    .orElseGet(() -> Arrays.asList("Hi", "Bye"));  // if so, yield a default one

这是否比使用三元运算符更好是值​​得怀疑的。我认为使用这个或 if-else 构造或来自 3rd 方库的包装器没有任何优势:

if (list.isEmpty() {
    list = Arrays.asList("Hi", "Bye");
}

用于处理可能为空的集合的内置语言解决方案是 Stream API 作为链式方法的声明性调用,不会在空集合中的 Stream 上执行。您可以将Stream 理解为针对可能为空的集合的包装器,目的是处理每个元素。 Optional 也是如此,不同之处在于处理单个实例(无论它是否是集合)。

List<String> list = Collections.emptyList(); // empty list
List<String> updated = list.stream()
    .filter(str -> str.startsWith("A")       // won't happen
    .map(String::toLowerCase)                // won't happen
    .collect(Collectors.toList());           // yields empty list

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-30
    • 2020-11-06
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    相关资源
    最近更新 更多