在Kotlin中getOrElseReturn的可能性

时间:2019-07-14 15:48:16

标签: java kotlin lambda java-8

例如,我经常遇到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中的类似类OptionalOptionTry的问题。

假设我有一些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)并且仍然可以编译,这让我感到惊讶。

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

2 个答案:

答案 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