Android Kotlin不能将list.sort()与lambda一起使用

时间:2017-08-23 17:54:08

标签: android sorting lambda kotlin

有一个字符串列表,对于过滤器,它直接采用lambda表达式

val list= ArrayList<String>()
list.add("eee")
list.add("888")
list.add("ccc")

list.filter({it.length > 0})

// this passing function works too
list.filter(fun(it) = it.length > 0)

它被定义为采用lambda函数类型:(T) -> Boolean

public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {
    return filterTo(ArrayList<T>(), predicate)
}

但类似的语法不适用于sort()。它要求使用sortWith。不明白为什么不能像filter()调用那样直接传递lambda表达式。

有人可以解释为什么sort()不能直接使用lambda函数的类似语法吗?

list.sort({ first: String, second: String ->
    first.compareTo(second)
})

list.sort定义如下,同样采用lambda函数:(T, T) -> Int

public inline fun <T> MutableList<T>.sort(comparison: (T, T) -> Int): Unit = throw NotImplementedError()

但它给出错误“使用sort((T,T) - &gt; Int):单位是错误使用sortWith(比较器(比较))而不是

sort()sortWith()在定义中都有Unit的相同返回类型

对于sortWith(),它必须通过比较器,如:

list.sortWith(Comparator { first, second ->
    first.compareTo(second)
})

定义为:

@kotlin.jvm.JvmVersion
public fun <T> MutableList<T>.sortWith(comparator: Comparator<in T>): Unit {
    if (size > 1) java.util.Collections.sort(this, comparator)
}

Arrays.sort也可以使用与filter()相同的语法,直接使用lambda函数

var listStr = TextUtils.join(", ", list);
Arrays.sort(arrayOf(listStr)) { first: String, second: String ->
    first.compareTo(second)
}

Arrays.sort定义为:

public static <T> void sort(T[] a, Comparator<? super T> c) {
    throw new RuntimeException("Stub!");
}

1 个答案:

答案 0 :(得分:1)

因为sort已弃用并标记为DeprecationLevel.ERROR

@Deprecated("Use sortWith(Comparator(comparison)) instead.", ReplaceWith("this.sortWith(Comparator(comparison))"), level = DeprecationLevel.ERROR)
@JvmVersion
@kotlin.internal.InlineOnly
@Suppress("UNUSED_PARAMETER")
public inline fun <T> MutableList<T>.sort(comparison: (T, T) -> Int): Unit = throw NotImplementedError()

这就是您收到错误的原因,编译器要求使用sortWith