【问题标题】:Comparator as lambda比较器作为 lambda
【发布时间】:2018-04-28 10:31:58
【问题描述】:

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

【问题讨论】:

  • 可以添加Comparator接口的代码吗?
  • 错误是什么?
  • 我假设你的Comparator接口是java.util.Comparator?
  • 是的,它需要java.util.Comparator
  • 您尝试调用它的实例类型是什么?

标签: lambda kotlin comparator


【解决方案1】:

如果你仔细看,你需要传递比较完整值的比较器,而不是列中的值。因此,假设您的表中的数据类型是Car(这样您就有了SortableTableView&lt;Car&gt;),并且第一列包含模型名称。然后你会写

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&lt;Any&gt;SortableTableView&lt;*&gt;。这确实应该更改为更具体的类型。但即使没有它,如果你能拥有CarBook

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

【讨论】:

    【解决方案2】:

    如果您确定您的SortableTableView 的泛型类型参数是String,您可以将其转换为SortableTableView&lt;String&gt;,然后调用它:

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

    或者,您可以转换 Comparator 单独采用的参数:

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

    【讨论】:

    • 有些列会是Date,所以我不能使用第一个解决方案。第二个解决方案给了我java.lang.ClassCastException: cz.foobar.ClientsFragment$onViewCreated$1 cannot be cast to java.util.Comparator
    • 你说得对,我也可以重现这个问题。这当然很有趣,我会看看我以后是否可以研究它 - 得到一个运行时错误是一件很奇怪的事情。
    猜你喜欢
    • 2021-09-27
    • 2017-10-28
    • 1970-01-01
    • 2017-10-07
    • 2020-02-09
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多