例如,我经常遇到function bp_emails($result, $to, $cc, $bcc, $subject, $body) {
$email_to = $to;
$email_body = $body;
$email_subject = $subject;
}
add_action( 'phpmailer_init', function( $phpmailer )
{
$phpmailer->action_function = 'bp_emails';
} );
和VAVR中的类似类Optional
,Option
,Try
的问题。
假设我有一些Either
,如果它为空,我想立即从某个方法返回(无例外,因为我的方法也返回了Optional
,所以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
。显然在Java中是不可能的,所以我考虑在Kotlin中尝试。
getOrElseReturn
令我惊讶的是,它实际上可以满足我的要求。如果将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
(我猜val block: (Optional<String>) -> Nothing
语句是return
)并且仍然可以编译,这让我感到惊讶。
顺便说一句,我知道这段代码并不是我想要的-有人可以传递另一个块而无需非本地返回该方法,但是我认为没有其他方法
答案 0 :(得分:5)
将方法的第二部分提取到另一个私有方法中,并调用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);
}
答案 1 :(得分:3)
回答科特林部分:
fun safeOptional(): Optional<Int> {
val extracted = Optional.of("123")
.getOrElseReturn { return Optional.empty() }
.......
}
这里的返回不是从lambda返回,而是从函数safeOptional
返回,因此lambda不返回任何内容(它返回Nothing)。 Lambda返回任何东西都不能作为Lambda返回任何东西传递。
要获取编译错误,您应该改为从lambda返回:
val extracted = Optional.of("123")
.getOrElseReturn { return@getOrElseReturn Optional.empty() }
通常,在Kotlin中不需要Optional。您应该改为使用可为空的类型。您可以将它们与nullsafe运算符(例如,猫王运算符-?:
:
fun nullsafe(x: String?): Optional<Int> {
val extracted = x ?: return Optional.empty()
val modified = extracted.toInt() * 2
return Optional.of(modified)
}
nullsafe("2") // => Optional[4]
nullsafe(null) // => Optional.empty