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