嵌套让块在Kotlin

时间:2018-02-16 13:52:45

标签: android kotlin

在Kotlin中使用多个嵌套let是一个好习惯,还是应该引入一个局部变量?有没有任何开销?

webView?.let { webview ->
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        webview.setLayerType(View.LAYER_TYPE_HARDWARE, null)
    } else {
        webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
    }

    webview.webViewClient = WebViewClient()

    webview.settings.let { settings ->
        settings.javaScriptEnabled = true
        settings.setSupportZoom(false)
        settings.builtInZoomControls = false
        settings.displayZoomControls = false
        settings.loadsImagesAutomatically = true
    }
}

4 个答案:

答案 0 :(得分:9)

由于内联let(请参阅:what is inlining,还有official docs),因此其费用与自行声明本地变量完全相同。如果您通过安全通话使用它,它还会添加空检查,您也必须手动执行此操作。

因此,使用它基本上没有任何开销,只要您的代码足够清晰,就可以随心所欲地使用它。

例如,代码如下:

webview.settings.let { settings ->
    settings.javaScriptEnabled = true
    settings.setSupportZoom(false)
}

...将大致转换为与此Java代码等效的字节码:

Settings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
settings.setSupportZoom(false);

除了settings之外可能会被称为var10000之类的通用名称,但除了这一点之外。重点是没有创建函数实例,也没有调用let函数或类似的东西,因此没有开销。

对于任何未来的问题,您实际上可以使用Kotlin plugin's bytecode viewer and decompiler

自行检查

答案 1 :(得分:1)

一边评论。可以使用let重写内部run块以提高可读性:

webview.settings.run {
    javaScriptEnabled = true
    setSupportZoom(false)
    builtInZoomControls = false
    displayZoomControls = false
    loadsImagesAutomatically = true
}

答案 2 :(得分:1)

作为zmbs13的补充:

由于您不需要对Get-Datastore -server xxx -name xxx | Select Name, Datacenter,CapacityGB,FreeSpaceGB,Type, >> @{N="Provisioned (GB)"; E={[math]::round(($_.ExtensionData.Summary.Capacity - $_.ExtensionData.Summary.FreeSpace + $_.ExtensionData.Summary.Uncommitted)/1GB,2) }}, >> @{N="Thin Provisioning"; E={($_.ExtensionData.Capability.PerFileThinProvisioningSupported)}} | format-table 进行空检查,因此最好使用带有接收器的lambda的apply

webview.settings

这使您的代码更加简洁,并避免了多次编写webview.settings.apply { // you refer to webview.settings with 'this', which can be omitted this.javaScriptEnabled = true // using this explicitely, in case there is another variable 'javaScriptEnabled' in this block setSupportZoom(false) // omitting this from here on builtInZoomControls = false displayZoomControls = false loadsImagesAutomatically = true } settings的冗余。

答案 3 :(得分:0)

Kotlin的创建者建议不要使用太多的嵌套let调用来获得更好的代码可读性和简洁性。他们在《行动中的科特琳》一书中说

  

当您需要检查null的多个值时,可以使用嵌套   let个调用来处理它们。但是在大多数情况下,这样的代码最终会公平地结束   冗长且难以遵循。通常,使用常规的if更容易   表达式以将所有值一起检查。