2015-03-19 12 views
7

Supponiamo che ci sia una tipica Java Bean:Riferimento metodo Java 8 concatenato?

class MyBean { 
    void setA(String id) { 
    } 

    void setB(String id) { 
    } 

    List<String> getList() { 
    } 
} 

E vorrei creare un modo più astratto di chiamare i setter con l'aiuto di un BiConsumer:

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)); 

C'è un modo per sostituire la lambda (myBean, id) -> myBean.getList().add(id) con un riferimento al metodo concatenato, ad esempio (myBean.getList())::add o myBean::getList::add o qualcos'altro?

+0

Che fai 'map.put (SomeEnum.List, (MyBean, id) -.> MyBean.getList() aggiungere (id))? – Andremoniy

+2

No, non c'è. I riferimenti al metodo non supportano il concatenamento. Nel tuo esempio non sarebbe chiaro quale dei due metodi debba ricevere il secondo parametro. Ad ogni modo, perché lo vuoi? – Holger

+0

@Andremoniy Inserisce una mappa, un 'BiConsumer' dato sotto forma di lambda. – m3th0dman

risposta

8

No, i riferimenti al metodo non supportano il concatenamento. Nel tuo esempio non sarebbe chiaro quale dei due metodi debba ricevere il secondo parametro.


Ma se si insiste su di essa ...

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); 

La denominazione del metodo suggeriscono per vederlo come prendere un BiConsumer esistente (qui, List.add) e anteporre una funzione (qui, MyBean.getList()) al suo primo argomento. È facile immaginare come possa sembrare un metodo di utilità equivalente per filtrare il secondo argomento o entrambi contemporaneamente.

Tuttavia, è principalmente utile per combinare le implementazioni esistenti con un'altra operazione. Nel tuo esempio specifico, il sito di utilizzo non è migliore che l'espressione lambda ordinaria

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

Accettazione basata sul primo commento: i riferimenti al metodo non supportano il concatenamento. – m3th0dman

Problemi correlati