比较器为lambda

时间:2017-11-15 09:12:16

标签: lambda kotlin comparator

我在Java library中使用了以下方法:

public void setColumnComparator(final int columnIndex, final Comparator<T> columnComparator)

Idea说它有以下原型:

setColumnComparator(columnIndex: Int, columnComparator: ((Any!, Any!) -> Int)!)

我该如何使用它?我知道它会是String,所以我想要这样的东西,但它没有编译。

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

2 个答案:

答案 0 :(得分:2)

如果仔细观察,则需要通过比较器来比较完整的值,而不是列中的值。因此,假设表中的数据类型为Car(因此您有SortableTableView<Car>),第一列包含模型名称。然后你就写了

setColumnComparator(0, { a, b -> a.modelName.compareTo(b.modelName) }

或更好:

setColumnComparator(0, compareBy({ it.modelName })

(见https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.comparisons/compare-by.html

根据签名IDEA显示,您可能会改为SortableTableView<Any>SortableTableView<*>。这确实应该更改为更具体的类型。但即使没有它,如果你可以有CarBook

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

答案 1 :(得分:1)

如果您确定SortableTableView的通用类型参数为String,则可以将其转换为SortableTableView<String>,然后拨打电话:

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

或者,您可以转换Comparator单独执行的参数:

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