Prima di dire nulla circa le espressioni lambda o interfacce funzionali, dobbiamo parlare del tuo errore davvero problematico: chiamirun()
su una discussione! Se si desidera iniziare una nuova discussione, è necessario chiamare start()
sull'istanza Thread
, se si desidera eseguire il codice in modo sequenziale, non creare uno Thread
(ma solo uno Runnable
).
Detto questo, vi sono alcuni metodi default
sulle interfacce funzionali di Java 8 per la combinazione di funzioni, ad es. puoi concatenare due Function
s tramite Function.andThen(…)
ma le combinazioni disponibili sono lontane dall'essere complete.
Se un certo compito che unisce ripete nella vostra applicazione, si può prendere in considerazione la creazione di metodi di utilità:
public static <T> Runnable bind(T value, Consumer<T> c) {
return()->c.accept(value);
}
public static <T,U> Consumer<U> compose(Function<U,T> f, Consumer<? super T> c) {
return u->c.accept(f.apply(u));
}
new Thread(bind("Hello 1", compose(upper, d))).start();
new Thread(bind("Hello 2", compose(lower, d))).start();
Ma queste tre parti sembrano più come un compito per l'API flusso:
Stream.of("Hello 1").map(upper).forEach(d);
Stream.of("Hello 2").map(lower).forEach(d);
Ho lasciato la creazione del nuovo thread qui, poiché non ha qualsiasi beneficio comunque.
Se si vuole veramente l'elaborazione parallela, è possibile farlo su una base per-carattere:
"Hello 1".chars().parallel()
.map(Character::toUpperCase).forEachOrdered(c->System.out.print((char)c));
ma ancora non sarà in alcun beneficio data la semplicità del compito e l'overhead fisso del elaborazione parallela.
Questi lambda sono tutti candidati ideali per l'utilizzo di _method references_ invece: System.out :: println, String :: toUpperCase. –