能给我在科特林的可系列化羊肉吗?我试图使用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似乎没有被翻译成java.lang.invoke.SerializedLambda,这是Jinq获取信息所必需的。因此,问题在于如何将其转换为SerializedLambda。
发布于 2018-07-10 17:08:39
我是金克的制造者。我还没有时间查看Kotlin支持,但根据您的描述,我假设Kotlin将其lambdas编译成实际的类或其他类。因此,Jinq可能需要一些特殊的代码来破解Kotlin lambdas,也可能需要特殊的代码来处理生成的代码中的任何不寻常的Kotlin-主义。Jinq应该能够处理它,因为以前对它进行了修改,以处理Scala。
如果您在Jinq中提交了一个有关它的问题,以及一个小的Kotlin示例(包括源文件和.class文件),那么我可以快速查看可能涉及的内容。如果是小的,我可以做那些改变。不幸的是,如果它看起来像很多工作,我不认为我真的可以有理由投入大量的资源来增加Kotlin对Jinq的支持。
发布于 2016-10-16 05:44:56
我对Jinq没有经验,但根据在GitHub中的实现和在Kotlin使用Java的经验。
参考文献: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) })
}免责声明:上述代码尚未测试。
https://stackoverflow.com/questions/40064479
复制相似问题