IntelliJ提出以下投诉:
Lambda参数应移出括号
val profile = loadProfiles()
profile.sortedWith(Comparator({ profile1, profile2 ->
if (profile1.age > profile2.age) return@Comparator 1
if (profile1.age < profile2.age) return@Comparator -1
return@Comparator 0
}))
data class Developer(var age: Int)
fun loadProfiles(): List<Developer> {
val listOfNumber = listOf<Developer>(Developer(2), Developer(5), Developer(3))
return listOfNumber
}
Run Code Online (Sandbox Code Playgroud)
我应如何格式化以上内容以消除投诉?另外,排序代码不会排序。是什么原因引起的?
Cil*_*ing 10
造成此警告的原因是,在Kotlin Labda中,参数可以(并且实际上应该在)括号之外。
看到这个:
fun onClick(action: () -> Unit) { ... }
Run Code Online (Sandbox Code Playgroud)
当您使用这样的功能时,您可以使用:
view.onClick({ toast(it.toString())} )
view.onClick() { toast(it.toString()) }
view.onClick { toast(it.toString()) }
Run Code Online (Sandbox Code Playgroud)
所有这些形式都是正确的(编译器不会失败),但是在《 Kotlin样式指南》中,您会找到以下语句:
如果调用只包含一个lambda,则应尽可能将其传递到括号之外。
@see https://kotlinlang.org/docs/reference/coding-conventions.html#lambda-formatting
这就是IntellJ显示警告的原因。您可以单击alt + Enter,然后IntellJ应该显示正确的解决方案,或者将lambda移出括号。如果labda仅是参数,则也请删除括号。Lambda何时必须放在括号中?仅当它不是函数中的最后一个参数时。
sortedWith():返回根据指定的[比较器]排序的所有元素的列表
因此,要对profile列表进行排序,您必须将返回的列表分配sortedWith()给profile(也将其声明从更改val为var)
var profile = loadProfiles()
profile = profile.sortedWith(Comparator { profile1, profile2 ->
if (profile1.age > profile2.age) return@Comparator 1
if (profile1.age < profile2.age) return@Comparator -1
return@Comparator 0
})
profile.forEach { println(it.age) }
Run Code Online (Sandbox Code Playgroud)
要么
val profile = loadProfiles().sortedWith(Comparator { profile1, profile2 ->
if (profile1.age > profile2.age) return@Comparator 1
if (profile1.age < profile2.age) return@Comparator -1
return@Comparator 0
})
Run Code Online (Sandbox Code Playgroud)
对于警告:按Alt + Enter并让InteliJ进行更改。
至于你眼前的问题,你只需这样写:
profile.sortedWith(Comparator { profile1, profile2 ->
if (profile1.age > profile2.age) return@Comparator 1
if (profile1.age < profile2.age) return@Comparator -1
return@Comparator 0
}
)
Run Code Online (Sandbox Code Playgroud)
然而,代码仍然有几层不必要的冗长。这里有一些方法可以使其更加简洁和更具可读性。
删除return语句:
profile.sortedWith(Comparator { profile1, profile2 ->
if (profile1.age > profile2.age) 1
else if (profile1.age < profile2.age) -1
else 0
})
Run Code Online (Sandbox Code Playgroud)使用when而不是if-else级联:
profile.sortedWith(Comparator { profile1, profile2 ->
when {
profile1.age > profile2.age -> 1
profile1.age < profile2.age -> -1
else -> 0
}
})
Run Code Online (Sandbox Code Playgroud)使用Int.compareTo:
profile.sortedWith(Comparator { profile1, profile2 ->
profile1.age.compareTo(profile2.age)
}
Run Code Online (Sandbox Code Playgroud)使用compareBy:
profile.sortedWith(compareBy(Profile::age))
Run Code Online (Sandbox Code Playgroud)sortedWith当您需要的只是:时,不要使用常规sortedBy:
profile.sortedBy(Profile::age)
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
4686 次 |
| 最近记录: |