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
遇到一些有趣的问题:例如,我必须选择一些解决方案,具体取决于我的 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