lambda比较器

lambda比较器,lambda,kotlin,comparator,Lambda,Kotlin,Comparator,我在中使用了以下方法: public void setColumnParator(final int columnIndex,final Comparator columnParator) Idea说它有以下原型: setColumnComparator(columnIndex: Int, columnComparator: ((Any!, Any!) -> Int)!) 我如何使用它?我知道它将是String,所以我想要这样的东西,但它无法编译 setColumnComparator

我在中使用了以下方法:

public void setColumnParator(final int columnIndex,final Comparator columnParator)
Idea说它有以下原型:

setColumnComparator(columnIndex: Int, columnComparator: ((Any!, Any!) -> Int)!)
我如何使用它?我知道它将是
String
,所以我想要这样的东西,但它无法编译

setColumnComparator(0, Comparator<String> { a, b -> a.compareTo(b) }
setColumnParator(0,比较器{a,b->a.compareTo(b)}

如果您确信
sortableview
的泛型类型参数是
String
,则可以将其强制转换为
sortableview
,然后调用它:

(tableView as SortableTableView<String>).setColumnComparator(1, { x, y ->
    x.compareTo(y)
})

如果您仔细观察,您需要传递comparator,它比较完整的值,而不是列中的值。因此,假设表中的数据类型为
Car
(因此您有一个
SortableTableView
),第一列包含模型名称。然后您可以编写

setColumnComparator(0, { a, b -> a.modelName.compareTo(b.modelName) }
或者更好:

setColumnComparator(0, compareBy({ it.modelName })
(见附件)

从签名的想法来看,您可能有一个
sortableview
sortableview
。这确实应该更改为一个更具体的类型。但即使没有它,如果您有一辆
Car
或一本
Book

compareBy({ (it as? Car)?.modelName }, { (it as? Book)?.title })

你能添加
比较器
接口的代码吗?错误是什么?我假设你的
比较器
接口是
java.util.Comparator
?是的,它需要
java.util.Comparator
。你试图调用它的实例的类型是什么?有些列是
Date
,所以我不能使用t第一个解决方案。第二个解决方案给了我
java.lang.ClassCastException:cz.foobar.ClientsFragment$onViewCreated$1不能转换为java.util.Comparator
你说得对,我也可以重现这个问题。这当然很有趣,我会看看是否可以稍后再研究它——关于运行时错误,这是一件奇怪的事情。
compareBy({ (it as? Car)?.modelName }, { (it as? Book)?.title })