2016-03-29 23 views
0

java8 (stream, lambda) ve guava'yı birleştirebilir miyim? dönüşümler ile uğraşırken

  1. kullanım java8: (örn: People bir özellik age içeren bir sınıftır List<Integer> ages e List<People> people dönüşümü), normalde bunu yapmanın (benim için) 2 yolu vardır

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

  2. veya kullanıcı guava2: People2AgeTransformer yaş dönmek için Fonksiyon arabirimini uygulayan bir transformatör olup

    Lists2.transform(people, People2AgeTransformer.INSTANCE);. kod

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

    bu parça beni karıştı herhangi bir hata olmadan uygundur ve Tamam çalıştırır:

Son zamanlarda, ben accidentlly java8 ve guava kombine edilebilir ve bu nedenle kod olabileceğini bulmuştur. yöntem Lists2.transform() java8 Lambda, arayüz java.util.function.Function uygulanması ise, arayüz com.google.common.base.Function uygulanması için 2. bağımsız değişken gerektirir. (İkisi de bir yöntem B apply(A input) ilan B. A dönüştürmek için)

I don Bunun neden farklı paketin iki farklı arayüzü olduğundan işe yaradığını anlıyoruz.

cevap

8

java8 lambda aslında değil

yok arayüzünün java.util.function.Function uygulanmasıdır. p -> p.getAge(), önceden tanımlanmış bir türe sahip değil - türü, çağrıldığı bağlama göre derleme zamanında çıkarılan. int/Integer getAge(Person p) yöntemine sahip herhangi bir işlevsel arabirim çalışacaktır.

Hem java.util.Function<Person, Integer> hem de com.google.common.base.Function<Person, Integer> uyumludur. Zaten değişken fn Java 8 Function nesne var ve So eğer

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; 

: Bir işlev değişkenine atanan veya parametre yoluyla geçirilen varsa

+0

Çok fazla! Sanırım java8 belgelerine bakmam gerekiyor. – LaiyuXuan

1

, bu Java 8 yöntem referanslar yoluyla adapte gerçekten çok kolay Bazı Guava koduna geçmek gerekiyor, sadece fn::apply kullanın. pred değişkeninde Java 8 Predicate varsa, Guava koduna geçirirken pred::test kullanın. Benzer metod referansları diğer fonksiyonel arayüzler için kullanılabilir.

İlgili konular