2016-12-30 10 views
6

GroovyのJava 8 ::(double colon operator)と同等の機能はありますか?Groovyに相当するJava 8 ::(double colon)演算子

私はグルーヴィーhttps://github.com/bytefish/PgBulkInsert

でこの例を翻訳しようとしている。しかしマッピング部は、Java 8と同じように動作しません:

public PersonBulkInserter() { 
    super("sample", "unit_test"); 

    mapString("first_name", Person::getFirstName); 
    mapString("last_name", Person::getLastName); 
    mapDate("birth_date", Person::getBirthDate); 
} 
+2

Groovyのメソッドのように見えます。ポインタ演算子 '。&'は閉じていますが、宣言するクラスのインスタンスが必要です。 – manouti

+0

実際、Groovyクラスのためには "Functional Interface"が必要です。 https://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html – Wavyx

+3

'mapString()'と 'mapDate() 'のコードを見ることなく、 'メソッドを呼び出すことができますが、このようなものは' mapString( "first_name"、{it.firstName} as Function) 'のように動作します。これは、関数ポインタのラムダからファンクショナルへのインタフェース表記法と同じくらい効率的ではありませんが、同じように動作します。 – BalRog

答えて

6

Groovyのが本当にインスタンス離婚を持っていませんインスタンスメソッド参照(編集:まだ。この回答のWavyxのコメントを参照してください)、代わりにクロージャーでそれを偽造する必要があります。 Java 8でインスタンスメソッドのリファレンス構文を使用する場合、実際に呼び出すインスタンスを最初の引数(この場合は唯一)として期待するラムダに相当するものを設定しています。

したがって、Groovyで同じ効果を得るには、デフォルトのit引数を呼び出しインスタンスとして使用するクロージャを作成する必要があります。

PersonBulkInserter() { 
    super("sample", "unit_test") 

    mapString("first_name", { it.firstName } as Function) 
    mapString("last_name", { it.lastName } as Function) 
    mapDate("birth_date", { it.birthDate } as Function) 
} 

お知らせここでGroovyのプロパティ表記の使用、およびmapString()またはmapDate()方法により期待@FunctionalInterface型にClosureをキャストする必要がある:このように。

+4

Java 8 ::(ダブルコロン)は2017年に追加されますhttps://twitter.com/glaforge/status/814890698369593348 – Wavyx

+0

これはリリースされましたか? –

+0

いいえ、考えられません。あなたはアップデートのために "glaforge"をtweetingしようとすることができます(Wavyxのコメントのリンクを参照)。彼はかなり反応していると聞いています。 – BalRog

関連する問題