gpt4 book ai didi

java - 空字符串的 Optional 实现

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:32:23 26 4
gpt4 key购买 nike

关于 Optional 的最好的事情之一是它保存了所有样板检查长链中的 null 值:

Optional.ofNullable(myService.getSomething())
.map(secondService::fetch)
.map(thirdService::fetchAgain)
// And so forth...

在任何时候,如果 map 返回一个 null,Optional 将跳到“空”轨道上。

如果可以对字符串做类似的事情,而不是每次都检查它们是否有 String::isEmpty,那就太好了:

Optional.ofNullable(entity.getName())
.filter(String::isEmpty)
.map(Utils::performSomeOperation)
.filter(String::isEmpty)
.or(service::getMostCommonName)
.filter(String::isEmpty)
.orElse("Bob");

像这样:

OptionalString.ofEmptyable(entity.getName())
.map(Utils::performSomeOperation)
.or(service::getMostCommonName)
.orElse("Bob");

Optional 中的关键逻辑发生在 ofNullable 中,当它调用对 value == null 的检查时。从理论上讲,您可以在其中应用任何类型的逻辑:

MagicalOptionalString(StringUtils::isNotBlank).ofEmptyable(entity.getName())
.map(Utils::performSomeOperation)
.or(service::getMostCommonName)
.orElse("Bob");

但是,Optional 是最终的,阻止了任何直接扩展此行为的方法。那么是否已经有一个现有的、强大的实现呢?

最佳答案

尝试一些事情来解决您的目标,并意识到我会支持 VGR 的想法,因为与使用现有方法相比,实现这样的用例需要做很多额外的工作。

然而,在花了一些时间查看实现后,我可以添加的细节很少 -

作为一个实用程序,您可以实现一个静态实现来验证 nullisEmpty字符串输入的条件并返回 Optional因此。代码可能类似于 -

private static Optional<String> ofEmptyable(String string) {
return isNullOrEmpty(string) ? Optional.empty() : Optional.of(string);
}

private static boolean isNullOrEmpty(String target) {
return target == null || target.isEmpty();
}

这可以取代 ofNullable 的用法专门检查 null (可选的主要目的)。


由于您的问题陈述中的期望是实际处理每个方法的案例(map/or/orElse )调用作为可选,一种类似于 OptionalInt 的方法可能是实现自定义 OptionalString作为-

public final class OptionalString {

private static final OptionalString EMPTY = new OptionalString();

private final boolean isPresent;
private final String value;

private OptionalString() {
this.isPresent = false;
this.value = "";
}

private static OptionalString empty() {
return EMPTY;
}

private boolean isPresent() {
return isPresent;
}

private OptionalString(String value) {
this.isPresent = true;
this.value = value;
}

public static OptionalString of(String value) {
return value == null || value.isEmpty() ? OptionalString.empty() : new OptionalString(value);
}

public OptionalString map(Function<? super String, ? extends String> mapper) {
return !isPresent() ? OptionalString.empty() : OptionalString.of(mapper.apply(this.value));
}

public OptionalString or(Supplier<String> supplier) {
return isPresent() ? this : OptionalString.of(supplier.get());
}

String orElse(String other) {
return isPresent ? value : other;
}

public String getAsString() {
return Optional.of(value).orElseThrow(() -> new NoSuchElementException("No value present"));
}
}

可以通过以下方式针对您的用例进一步实现 -

String customImpl = OptionalString.of(entity.getName())
.map(OptionalStringTest::trimWhiteSpaces) // OptionalStringTest is my test class name where 'trimWhiteSpaces' operation on String resides
.or(service::getMostCommonName)
.orElse("learning");
System.out.println(String.format("custom implementation - %s", customImpl));

在哪里

private static String trimWhiteSpaces(String x) {
return x.trim();
}

注意 - 老实说,我找不到没有 OptionalString 的理由在 JDK 中提前上课(我之所以这么说是因为我怀疑它背后肯定有一个想法),我相信这只是我的影响范围小得多,我希望有人可靠地添加到详情在这里。恕我直言,使用 Optional<String> 似乎几乎所有你想要的东西都在那里这将我们带回到循环的开始。

关于java - 空字符串的 Optional 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51771324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com