Utilizzare il riferimento al metodo con parametro

Ho appena iniziato a imparare i flussi Java e ho dovuto affrontare un problema. Si prega di dare un’occhiata al seguente esempio. Questo fa parte di una class Node:

private Map nodes; public Optional child(String name) { return Optional.ofNullable(nodes.get(name)); } private void findChildren(String name, List result) { child(name).ifPresent(result::add); nodes.values().stream() // .map(Node::findChildren(name, result)) // .forEach(Node::findChildren(name, result)) .forEach(node -> node.findChildren(name, result)); } 

Il mio intento era di chiamare #findChildren con il nome e i parametri di risultato su ogni nodo nello stream. Ho provato ad usare il metodo riferimenti Node :: findChildren senza fortuna. Apprezzerei soluzioni diverse da quella con -> operatore.

È in qualche modo ansible utilizzare il riferimento al metodo insieme a un parametro? Mi piace l’idea dei flussi e voglio solo rendere il codice più leggibile.

In realtà, penso che ci sia una domanda simile. Riferimenti al metodo con un parametro che ho letto ma non riesco a capire come utilizzare il metodo bind2 nel mio codice. È l’unica soluzione?

Non è ansible utilizzare i riferimenti al metodo per questo scopo. Devi ricorrere alle espressioni lambda. Il motivo per cui il metodo bind2 della domanda collegata non funziona è che si sta effettivamente tentando di associare due parametri per convertire una funzione di tre argomenti in una funzione di un argomento. Non esiste una soluzione altrettanto semplice in quanto non esiste interface funzionale standard per i consumatori a tre livelli.

Dovrebbe essere simile

 interface ThreeConsumer { void accept(T t, U u, V v); } public static  Consumer bind2and3( ThreeConsumer c, U arg2, V arg3) { return (arg1) -> c.accept(arg1, arg2, arg3); } 

Quindi. .forEach(bind2and3(Node::findChildren, name, result)); potrebbe funzionare. Ma è davvero più semplice di .forEach(node -> node.findChildren(name, result)); ?