Kotlin中的Jinq-如何将lambda转换为java序列化lambda?

Kotlin中的Jinq-如何将lambda转换为java序列化lambda?,kotlin,kotlin-interop,Kotlin,Kotlin Interop,我可以在Kotlin中使用可序列化的lambda吗?我试图使用Kotlin的Jinq库,但它需要可序列化的lambda。是否有任何语法使其成为可能 更新: 我的代码: var temp=anyDao.streamAll(Task::class.java) .where<Exception,Task> { t->t.taskStatus== TaskStatus.accepted } .collect(Collectors.toList<Task>());

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

更新:

我的代码:

var temp=anyDao.streamAll(Task::class.java)
   .where<Exception,Task> { t->t.taskStatus== TaskStatus.accepted }
   .collect(Collectors.toList<Task>());
lambda中引用的所有对象都是可序列化的(代码在java中不会导致任何错误)

更新2


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

我没有Jinq方面的经验,但根据GitHub中的实现以及我在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>());
参考:

在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>());
var temp=anyDao.streamAll(Task::class.java)
.where(JinqStream.where{t->t.taskStatus==taskStatus.accepted})
.collect(Collectors.toList());
//或者,可以先导入接口
导入org.jinq.orm.stream.JinqStream*
... 
//然后你可以用Where代替JinqStream
var temp=anyDao.streamAll(Task::class.java)
.where(其中{t->t.taskStatus==taskStatus.accepted})
.collect(Collectors.toList());
或者创建自定义扩展来包装实现

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

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

我是精灵的制造者。我还没有时间研究Kotlin的支持,但根据您的描述,我假设Kotlin将其lambda编译成实际的类或其他东西。因此,Jinq可能需要一些特殊代码来破解打开的Kotlin lambdas,也可能需要特殊代码来处理生成代码中任何异常的Kotlin ISM。Jinq应该能够处理它,因为它以前被改装为处理Scala lambdas


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

你知道这一点吗?@chris no,最后我使用了它,它更详细,但仍然比原始实体管理器更好