1

我可以在 Kotlin 中有可序列化的 lambda 吗?我正在尝试使用 Kotlin 的 Jinq 库,但它需要可序列化的 lambda。是否有任何语法使它成为可能?

更新:

我的代码:

var temp=anyDao.streamAll(Task::class.java)
   .where<Exception,Task> { t->t.taskStatus== TaskStatus.accepted }
   .collect(Collectors.toList<Task>());

我收到此错误:

Caused by: java.lang.IllegalArgumentException: 
Could not extract code from lambda. 
This error sometimes occurs because your lambda references objects that aren't Serializable.

lambda 中引用的所有对象都是可序列化的(代码在 java 中不会产生错误)。

更新 2

调试后,似乎 kotlin lambda 没有翻译成 Jinq 从中获取信息所需的 java.lang.invoke.SerializedLambda。所以问题是如何将其转换为 SerializedLambda。

4

2 回答 2

1

我是Jinq的制造者。我没有时间查看 Kotlin 支持,但根据您的描述,我假设 Kotlin 将其 lambda 编译成实际的类或其他东西。因此,Jinq 可能需要一些特殊代码来破解开放的 Kotlin lambda,并且它可能还需要特殊代码来处理生成的代码中任何不寻常的 Kotlin 主义。Jinq 应该能够处理它,因为它之前被改装为处理 Scala lambdas。

如果您在 Jinq github 中提交了一个关于它的问题,以及一个小的 Kotlin 示例(以源文件和 .class 文件形式),那么我可以快速浏览一下可能涉及的内容。如果它很小,我可以进行这些更改。不幸的是,如果看起来工作量很大,我认为我不能证明投入大量资源来为 Jinq 添加 Kotlin 支持是合理的。

于 2018-07-10T17:08:39.460 回答
0

我对 Jinq 没有经验,但是根据 GitHub 中的实现和我在 Kotlin 中使用 Java Library 的经验。

参考:https ://github.com/my2iu/Jinq/blob/master/api/src/org/jinq/orm/stream/JinqStream.java

您总是可以回退到使用 Kotlin 中的本机 Java 接口。

var temp = anyDao.streamAll(Task::class.java)
   .where( JinqStream.Where<Task,Exception> { t -> t.taskStatus == TaskStatus.accepted } )
   .collect(Collectors.toList<Task>());

 // Alternatively, You you can import the interface first
 import org.jinq.orm.stream.JinqStream.*

  ... 

  // then you can use Where instead of JinqStream.Where
  var temp = anyDao.streamAll(Task::class.java)
       .where(Where<Task,Exception> { t -> t.taskStatus == TaskStatus.accepted } )
       .collect(Collectors.toList<Task>());

或者制作一个自定义扩展来包装实现

fun JinqStream<T>.where(f: (T) -> Boolean): JinqStream<T> {
  return this.where(JinqStream.Where<T,Exception> { f(it) })
}

免责声明:以上代码未经测试。

于 2016-10-16T05:44:56.063 回答