Lambda参数应移出括号

时间:2018-11-19 13:06:22

标签: 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
}

我应该如何格式化以上内容以消除投诉?另外,排序代码不会排序。是什么原因引起的?

3 个答案:

答案 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
        }
)

但是,该代码仍然具有几层不必要的冗长性。这里有一些使它既简洁又可读的方法。

  1. 删除return语句:

    profile.sortedWith(Comparator { profile1, profile2 ->
        if (profile1.age > profile2.age) 1
        else if (profile1.age < profile2.age) -1
        else 0
    })
    
  2. 使用when代替if-else级联:

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

    profile.sortedWith(Comparator { profile1, profile2 ->
        profile1.age.compareTo(profile2.age) 
    }
    
  4. 使用compareBy

    profile.sortedWith(compareBy(Profile::age))
    
  5. 当您只需要sortedWith时就不要使用常规的sortedBy

    profile.sortedBy(Profile::age)