Optional::isPresentOrElse -> 列表<>模拟

Optional::isPresentOrElse -> List<> analog

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

Optional 理解为针对可能 null 实例 提供可链式空安全方法的包装器。建议 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 构造或来自第 3 方库的包装器没有优势:

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