Lambda参数应移出括号

And*_*Dev 6 kotlin

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何时必须放在括号中?仅当它不是函数中的最后一个参数时。


for*_*pas 5

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

因此,要对profile列表进行排序,您必须将返回的列表分配sortedWith()profile(也将其声明从更改valvar

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进行更改。


Mar*_*nik 5

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

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)

然而,代码仍然有几层不必要的冗长。这里有一些方法可以使其更加简洁和更具可读性。

  1. 删除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)
  2. 使用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)
  3. 使用Int.compareTo

    profile.sortedWith(Comparator { profile1, profile2 ->
        profile1.age.compareTo(profile2.age) 
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 使用compareBy

    profile.sortedWith(compareBy(Profile::age))
    
    Run Code Online (Sandbox Code Playgroud)
  5. sortedWith当您需要的只是:时,不要使用常规sortedBy

    profile.sortedBy(Profile::age)
    
    Run Code Online (Sandbox Code Playgroud)