2016-03-29 1 views
0

私はjava8(ストリーム、ラムダ)とグアバを組み合わせることができますか?変換を扱う場合

  1. 使用java8:(例:Peopleプロパティageを含むクラスがあるList<Integer> agesList<People> people変換)、通常はこれを行う(私にとっては)2つの方法があります

    people.stream().map(p -> p.getAge()).collect(toList());

  2. またはユーザーguava2:People2AgeTransformerは年齢を返すように関数インタフェースを実装する変圧器である

    Lists2.transform(people, People2AgeTransformer.INSTANCE);。コードの

    Lists2.transform(people, p->p.getAge()); 
    

    この作品は私が混乱してしまい、エラー、なし遵守し、[OK]を実行します:

最近、私はaccidentlly java8とグアバを組み合わせることができ、したがって、コードができることを見出しました。 java8ラムダは、実際インターフェースjava.util.function.Functionの実装である 方法Lists2.transform()は、インターフェースcom.google.common.base.Functionの実装であることを第2の引数を必要とする。(まあ、どちらもBに変換する方法B apply(A input)を宣言する)

Iドンなぜ彼らは異なるパッケージの2つの異なるインターフェースであるので、これがうまくいくのか理解できません。

答えて

8

java8ラムダはありません、それはありません実際にインタフェースjava.util.function.Function

の実装です。 p -> p.getAge()には定義済みの型がありません。その型は、呼び出されるコンテキストに応じてコンパイル時にが推定されるです。 int/Integer getAge(Person p)メソッドを持つ任意の機能インターフェイスが動作します。

したがって、java.util.Function<Person, Integer>com.google.common.base.Function<Person, Integer>の両方が互換性があります。

+0

Thx a lot! java8のドキュメントを調べる必要があると思います。 – LaiyuXuan

1

あなたはパラメータを介して可変または合格に割り当てられた機能を持っている場合、それは、Java-8メソッド参照を経由して、それらを適応させることはとても簡単です:

java.util.function.Function<Person, Integer> javaFunction = p -> p.getAge(); 
com.google.common.base.Function<Person, Integer> guavaFunction = javaFunction::apply; 
java.util.function.Function<Person, Integer> javaFunction2 = guavaFunction::apply; 

だから、あなたはすでに変数fnでJava 8 Functionオブジェクトを持っている場合と、いくつかのGuavaコードに渡す必要があります。ただfn::applyを使用してください。変数predにJava 8 Predicateがある場合は、Guavaコードに渡すときにpred::testを使用してください。他の機能的なインタフェースについても、同様のメソッド参照を使用できます。