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
}
我应该如何格式化以上内容以消除投诉?另外,排序代码不会排序。是什么原因引起的?
答案 0 :(得分:5)
此警告是由于在Kotlin labda中参数可以(实际上应该是)在括号之外。
看到这个:
fun onClick(action: () -> Unit) { ... }
使用此类功能时,可以使用:
view.onClick({ toast(it.toString())} )
view.onClick() { toast(it.toString()) }
view.onClick { toast(it.toString()) }
所有这些形式都是正确的(编译器不会失败),但是在《 Kotlin样式指南》中,您会找到以下语句:
如果调用需要一个lambda,则应将其传递到外部 括号。
@请参阅https://kotlinlang.org/docs/reference/coding-conventions.html#lambda-formatting
这就是为什么IntellJ显示警告。您可以单击alt + Enter,然后IntellJ应该显示正确的解决方案,或者将lambda移出括号。如果labda仅是参数,则也请删除括号。 Lambda何时必须放在括号中?仅当它不是函数中的最后一个参数时。
答案 1 :(得分:3)
sortedWith():返回根据元素排序的所有元素的列表 指定的[比较器]
因此,要对profile
列表进行排序,您必须将sortedWith()
返回的列表分配给profile
(还将其声明从val
更改为var
)< / p>
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) }
或
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
})
对于警告:按Alt + Enter并让InteliJ进行更改。
答案 2 :(得分:1)
对于您眼前的问题,您只需要这样写:
profile.sortedWith(Comparator { profile1, profile2 ->
if (profile1.age > profile2.age) return@Comparator 1
if (profile1.age < profile2.age) return@Comparator -1
return@Comparator 0
}
)
但是,该代码仍然具有几层不必要的冗长性。这里有一些使它既简洁又可读的方法。
删除return
语句:
profile.sortedWith(Comparator { profile1, profile2 ->
if (profile1.age > profile2.age) 1
else if (profile1.age < profile2.age) -1
else 0
})
使用when
代替if-else
级联:
profile.sortedWith(Comparator { profile1, profile2 ->
when {
profile1.age > profile2.age -> 1
profile1.age < profile2.age -> -1
else -> 0
}
})
使用Int.compareTo
:
profile.sortedWith(Comparator { profile1, profile2 ->
profile1.age.compareTo(profile2.age)
}
使用compareBy
:
profile.sortedWith(compareBy(Profile::age))
当您只需要sortedWith
时就不要使用常规的sortedBy
:
profile.sortedBy(Profile::age)