2016-10-15 15 views
1

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

更新:

マイコード:

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に変換する方法です。

答えて

0

私はJinqについての経験はありませんが、GitHubでの実装とKotlinでのJavaライブラリの使用経験に基づいています。

REF: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) }) 
} 

免責ラップするカスタム拡張を行います。上記のコードがテストされていませんが。

関連する問題