gpt4 book ai didi

java - Kotlin 中 getOrElseReturn 的可能性

转载 作者:行者123 更新时间:2023-11-29 10:08:31 25 4
gpt4 key购买 nike

我经常遇到 Optional 的问题和类似类(class)Option , Try , Either来自 VAVR例如。

假设我有一些 Optional ,如果它是空的,我想立即从一个方法返回(毫无异常(exception),因为我的方法也返回 Optional,所以 getOrElseThrow 不在画面中),如果它存在,我想进一步处理它。

public Optional<Integer> converter() {
Optional<String> opt = getSomething();

if(!opt.isPresent())
return Optional.empty();

String value = opt.get();
// some manipulations on value, such as map and flatMap would cause a huge mess
return Integer.parseInt(value);
}

我只需要在值为空的情况下立即返回,我不能做 map 的链和 flatMap .整个痛苦都在做.get() .类似于 getOrElseThrow , 但带有 return而不是 throw太棒了 - getOrElseReturn .在 Java 中显然不可能,所以我考虑在 Kotlin 中尝试。

fun safeOptional(): Optional<Int> {
val extracted = Optional.of("123")
.getOrElseReturn { return Optional.empty() }

val modified = extracted.toInt() * 2

return Optional.of(modified)
}

private inline fun <T> Optional<T>.getOrElseReturn(block: (Optional<T>) -> T): T {
return if (!this.isPresent)
block(this)
else
this.get()
}

令我惊讶的是,它确实按照我的意愿行事。如果我更改 Optional.of("123")Optional.empty()它立即从一个方法返回。我不明白它是如何编译的。

我的方法需要一个 block: (Optional<T>) -> T ,否则它不会编译。所以就我而言,我有 Optional<String>我需要通过 block: (Optional<String>) -> String ,但是嘿 - 我拥有的 block 与此相去甚远,但它仍然可以编译,如何?

当我将 block 提取到变量时,它变为 val block: (Optional<String>) -> Nothing (我猜 return 语句是 Nothing )它仍然编译,更让我惊讶。

顺便说一句,我知道这段代码严格来说并不是我想要的——有人可以传递另一个 block 而无需非本地返回到该方法,但我认为没有其他方法

最佳答案

将方法的第二部分提取到另一个私有(private)方法中并调用 getSomething().map(this::otherPrivateMethod)

如果 getSomething() 中没有值,则不会调用它

基本上,

public Optional<Integer> converter() {
return getSomething().map(this::privateConverter);
}

private Integer privateConverter(Integer integer) {
// some manipulations on value, such as map and flatMap would cause a huge mess
return Integer.parseInt(value);
}

关于java - Kotlin 中 getOrElseReturn 的可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57028896/

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