Se creo un'interfaccia funzionale:Come utilizzare direttamente una funzione come un tipo funzionale in Java 8
@FunctionalInterface
public class Consumer2<T1, T2> {
void accept(T1 t1, T2 t2);
default Consumer1<T2> curry(T1 t1) {
return (t2) -> accept(t1, t2);
}
}
Ora, se ho una classe:
public class MyClass {
public void printStrings(String a, String b) {
System.out.println(a + ": " + b);
}
}
MyClass myClass = new MyClass();
Ora, se voglio usare la mia interfaccia funzionale, posso:
Consumer2<String, String> printString = myClass::printStrings;
printString.curry("hello").accept("world");
Ma non posso fare qualcosa di simile:
myClass::printStrings.curry("hello").accept("world");
che ha senso, perché Java non ha modo di sapere che myClass::printStrings
può essere applicato all'interfaccia funzionale Consumer2
. Per fare questo, ho creato una classe di utilità:
public class F {
public static <T1, T2> Consumer2<T1, T2> c2(Consumer2<T1, T2> fn) {
return fn;
}
}
Allora posso:
F.c2(myClass::printStrings).curry("hello").accept("world");
Anche, questo funzionerà:
((Consumer2<String, String>)myClass::printStrings).curry("hello").accept("world");
Finché c'è qualche modo per Java 8 per capire che tipo funzionale in questo caso. Quindi, la domanda è, qual è il modo migliore per farlo, evitando possibilmente il boilerplate?
Credo classe 'Consumer2' si suppone essere' interfaccia Consumer2' ... – Holger