2015-03-19 30 views
7

tipik bir Java Bean bulunduğunu varsayalım:Java 8 zincirleme yöntem başvurusu?

class MyBean { 
    void setA(String id) { 
    } 

    void setB(String id) { 
    } 

    List<String> getList() { 
    } 
} 

Ve ben bir BiConsumer yardımıyla ayarlayıcıları çağıran bir daha soyut bir şekilde oluşturmak istiyoruz:

Map<SomeEnum, BiConsumer<MyBean, String>> map = ... 
map.put(SomeEnum.A, MyBean::setA); 
map.put(SomeEnum.B, MyBean::setB); 
map.put(SomeEnum.List, (myBean, id) -> myBean.getList().add(id)); 

bir yolu var mı (myBean, id) -> myBean.getList().add(id) lambda, zincirleme yöntem referansı, (myBean.getList())::add veya myBean::getList::add veya başka bir şeyle değiştirin?

+0

'map.put (SomeEnum.List, (myBean, id) doest Ne -.> myBean.getList() ekleyin (id)); 'yapmak? – Andremoniy

+2

Hayır yok. Yöntem referansları zincirlemeyi desteklemez. Örneğinizde, hangi iki yöntemin ikinci parametreyi alması gerektiği açık değildir. Neyse, neden bunu istiyorsun? – Holger

+0

@Andremoniy Bir haritaya koyar, bir lambda şeklinde verilen bir "BiConsumer". – m3th0dman

cevap

8

Hayır, yöntem başvuruları zincirlemeyi desteklemiyor. Örneğinizde, hangi iki yöntemin ikinci parametreyi alması gerektiği açık değildir. Eğer ... üzerinde

static <V,T,U> BiConsumer<V,U> filterFirstArg(BiConsumer<T,U> c, Function<V,T> f) { 
    return (t,u)->c.accept(f.apply(t), u); 
} 

...

BiConsumer<MyBean, String> c = filterFirstArg(List::add, MyBean::getList); 

yöntemin adlandırma ısrar ederseniz


Ama varolan (burada, List.add) BiConsumer ve prepend alarak gibi kullanmak için önermek ilk argümanına bir işlev (burada, MyBean.getList()). İkinci bağımsız değişkeni veya her ikisini birden filtrelemek için eşdeğer bir yardımcı yöntemin nasıl görüneceğini hayal etmek kolaydır. Bununla birlikte, temel olarak mevcut uygulamaları başka bir işlemle birleştirmek için kullanışlıdır. Belirli bir örnekte, kullanım sitesi sıradan lambda ifadesi daha iyi değildir

BiConsumer<MyBean, String> c = (myBean, id) -> myBean.getList().add(id); 
+1

İlke dayalı kabul etme yorum - yöntem referansları zincirlemeyi desteklemez. – m3th0dman