Kotlin Lambda参数应从括号中移出

Kotlin Lambda参数应从括号中移出,kotlin,Kotlin,IntelliJ提出以下投诉: Lambda参数应从括号中移出 val profile=loadProfiles() profile.sortedWith(比较器({profile1,profile2-> 如果(profile1.age>profile2.age)return@Comparator1. if(profile1.age 如果(profile1.age>profile2.age)return@Comparator1. if(profile1.age 如果(profile1.age>p

IntelliJ提出以下投诉:

Lambda参数应从括号中移出

val profile=loadProfiles()
profile.sortedWith(比较器({profile1,profile2->
如果(profile1.age>profile2.age)return@Comparator1.
if(profile1.age
我应该如何设置上述格式以消除投诉?此外,排序代码不会排序。是什么导致了问题

sortedWith():返回根据排序规则排序的所有元素的列表 指定[比较器]

因此,要对
profile
列表进行排序,您必须将
sortedWith()
返回的列表分配给
profile
(同时将其声明从
val
更改为
var

var profile=loadProfiles()
profile=profile.sortedWith(比较器{profile1,profile2->
如果(profile1.age>profile2.age)return@Comparator1.
if(profile1.age

val profile=loadProfiles().sortedWith(比较器{profile1,profile2->
如果(profile1.age>profile2.age)return@Comparator1.
if(profile1.age

警告:按Alt+Enter并让InteliJ进行更改。

此警告是因为Kotlin lambda中的参数可以(实际上应该)在括号外

见此:

fun onClick(action: () -> Unit) { ... }
当您使用这样的函数时,您可以使用:

view.onClick({ toast(it.toString())} )
view.onClick() { toast(it.toString()) }
view.onClick { toast(it.toString()) }
所有这些表单都是正确的(编译器不会失败),但在《Kotlin样式指南》中,您会发现以下语句:

profile.sortedWith(Comparator { profile1, profile2 ->
    if (profile1.age > profile2.age) 1
    else if (profile1.age < profile2.age) -1
    else 0
})
如果一个调用占用一个lambda,则应将其传递到 尽可能使用括号

@看

这就是IntelliJ显示警告的原因。您可以按Alt+Enter,IntelliJ应该显示正确的解决方案,或者只是将lambda移出括号。若lambda是唯一的参数,那个么也去掉括号


什么时候lambda必须在括号中?仅当它不是函数中的最后一个参数时。

至于您眼前的问题,您只需这样编写:

profile.sortedWith(Comparator { profile1, profile2 ->
            if (profile1.age > profile2.age) return@Comparator 1
            if (profile1.age < profile2.age) return@Comparator -1
            return@Comparator 0
        }
)
  • 时使用
    ,而不是在else时使用
    级联:

    profile.sortedWith(Comparator { profile1, profile2 ->
        when {
            profile1.age > profile2.age -> 1
            profile1.age < profile2.age -> -1
            else -> 0
        }
    })
    
  • 使用
    compareBy

    profile.sortedWith(compareBy(Profile::age))
    
    profile.sortedBy(Profile::age)
    
  • 当您只需要通过分拣时,不要使用常规的分拣方式:

    profile.sortedWith(compareBy(Profile::age))
    
    profile.sortedBy(Profile::age)
    

  • 您可能还对{it.age}
    profile.sortedBy{it.age}感兴趣。。。还要注意的是,它不是对基础列表进行排序,而是返回一个新的排序列表。。。。我的意思是:
    Alt
    +
    Enter
    或者点击灯泡让Intellij帮你解决这个问题……或者更好(我认为)
    .sortedBy{it.age}
    profile.sortedWith(compareBy(Profile::age))
    
    profile.sortedBy(Profile::age)