在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
}
}
答案 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
更容易 表达式以将所有值一起检查。