1

Kotlin でシリアライズ可能なラムダを使用できますか? Kotlin の Jinq ライブラリを使用しようとしていますが、シリアライズ可能なラムダが必要です。それを可能にする構文はありますか?

アップデート:

私のコード:

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.

ラムダで参照されるすべてのオブジェクトはシリアライズ可能です (コードは Java でエラーになりません)。

更新 2

デバッグ後、kotlin ラムダは、Jinq が情報を取得するために必要な java.lang.invoke.SerializedLambda に変換されていないようです。問題は、それをどのように SerializedLambda に変換するかです。

4

2 に答える 2

0

私は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) })
}

免責事項: 上記のコードはテストされていません。

于 2016-10-16T05:44:56.063 に答える