当对象为空时,从Kotlin中的函数返回为单行

时间:2017-08-31 14:05:13

标签: kotlin

我有一个看起来像这样的Java方法:

void doStuff() {
    MyObject myObject = myObjectRepository.findById(myObjectId);
    if (myObject == null) {
        log.warn("myObject not found, aborting");
        return;
    }

    // More stuff
}

有没有办法让这个在Kotlin中成为一个单行?我在想这样的事情(这不起作用):

fun doStuff() {
    // I'd like to do something here that returns from the doStuff function when myObject is null
    val myObject = myObjectRepository.findById(myObjectId) 
                    ?: {log.warn("myObject not found, aborting") return}

   // More stuff
}

你能做这样的事吗?

2 个答案:

答案 0 :(得分:4)

fun doStuff() {

    val myObject = myObjectRepository.findById(myObjectId) 
                    ?: log.warn("myObject not found, aborting").also{ return }

   // More stuff
}

但我同意DPM,经典if-else是更好的选择。

您可能还需要考虑when构造(取决于大小,函数的任务和返回类型):

fun doStuff() {

    val myObject = myObjectRepository.findById(myObjectId) 

    return when {
        myObject == null -> log.warn("myObject not found, aborting") // Unit?
        else -> // More stuff
    }
}

您可能更喜欢when而非if-else的原因之一也是因为我发现它更好地利用了空间(可读if-else使用至少4个,有时5个,位置)它更清晰,因为你有一个关键字when处于同一级别的返回(或分配,或其他),每个案例纯粹而简单,没有任何额外的关键字,只是一个非文字符号->明确说明了代码中的条件。

但是,also是kotlin标准库提供的扩展函数。 这是我最喜欢Kotlin的功能之一,它为您提供了很多力量和表现力。

我建议您link进一步调查并详细了解其他有用的功能,例如runletapplytakeUnless和{ {1}}

答案 1 :(得分:4)

 val myObject = myObjectRepository.findById(myObjectId)?:run { 
   log.warn("myObject not found, aborting"); return
 }
 //more stuff