【问题标题】:Filter collection in Kotlin with existing java.util.Predicate instance使用现有 java.util.Predicate 实例过滤 Kotlin 中的集合
【发布时间】:2019-07-11 15:21:21
【问题描述】:

我想使用 java.util.Predicate 实现的实例过滤 Kotlin 中的值集合,基本上是这样的:

val predicate = JsQueryPredicate<SportEvent>(query)
schedule.sport_events.filter(predicate)

但这并不能编译。以下作品,这是推荐的这样做方式吗?感觉有点麻烦

val predicate = JsQueryPredicate<SportEvent>(query)
schedule.sport_events.filter { predicate.test(it) }

【问题讨论】:

    标签: java kotlin filter collections predicate


    【解决方案1】:

    您可以使用方法引用,它会隐式转换为(T) -&gt; Boolean,从而允许您调用filter 方法:

    schedule.sport_events.filter(predicate::test)
    

    【讨论】:

      【解决方案2】:

      更直接地回答:是的...predicate.test(it) 或几乎等效的方法参考predicate::test 是要走的路...除了...

      如果您必须更频繁地处理 Java 谓词和/或将来计划将 Java 函数类型(例如 Predicate)重构为 Kotlin 函数类型,您可能还想添加适当的扩展函数,例如:

      fun <T> Iterable<T>.filter(predicate: Predicate<T>) = filter { predicate.test(it) }
      

      然后使用以下用法:

      val javaPredicate : Predicate<String> = Predicate { it == "hello" }
      listOf("hello", "world")
              .filter(javaPredicate)
      

      如果您将来将 Predicate 替换为,例如(T) -&gt; Boolean 然后您不需要调整该过滤器,只需将导入语句替换/删除扩展函数即可。

      扩展函数也可以将 Predicate 转换为适当的 Kotlin 函数类型,但在未来的重构中可能对您没有太大帮助:

      operator fun <T> Predicate<T>.invoke() : (T) -> Boolean = ::test
      fun <T> Predicate<T>.transform() : (T) -> Boolean = ::test
      

      使用示例:

      val javaPredicate : Predicate<String> = Predicate { it == "hello" }
      
      // variant with Predicate.invoke:
      listOf("hello", "world")
          .filter(javaPredicate())
      
      // variant using Predicate.transform()
      listOf("hello", "world")
          .filter(javaPredicate.transform())
      

      因此,我建议您使用重载的filter-方法,以防您计划重构或坚持使用filter { predicate.test(it) }/filter(predicate::test),这可能会使未来的重构变得更加困难(IDE 有帮助;-))。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-26
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        相关资源
        最近更新 更多