2017-08-31 128 views
1

我有一个Java方法,看起来像这样:返回时,对象为空

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

    // More stuff 
} 

有没有一种方法,使这一个班轮在科特林?我在想这样的事情(不起作用):

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 
} 

你能做这样的事情吗?

+4

我个人不认为这将提高可读性 – DPM

+1

你应该使用Elvis运算符 –

+0

,如果这是一个稍微常见的情况下输入较少的问题,我会在我的ide中定义一个名为ifnullret的模板。像“if($ var == null)log.warn($ msg)返回” – DPM

回答

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,loc),它更清晰,因为你有关键字when在同一水平的回报(或分配,或任何)和每个案例纯粹和简单,没有任何额外的关键字,只是一个非文字符号->明确指出条件从代码。

然而,also是由kotlin标准库提供的扩展函数。 这是我最爱Kotlin的功能之一,它给了你很多的力量和表现力。

让我建议你这个link进一步调查和了解其他有用的功能,例如runletapplytakeUnlesstakeIf

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