Desidero prendere un singolo messaggio di registro pojo LoggedExchange
e applicare un gruppo di trasformazioni ad esso. Le trasformazioni sono UnaryOperators in un elenco:Applicazione di un elenco di funzioni a un valore con Java8 stream api
List<ConditionalTransform> transforms = new ArrayList<>();
dove ConditionalTransform
implementa UnaryOperator<LoggedExchange>
e la mia soluzione corrente utilizza ridurre in questo modo:
public LoggedExchange transform(LoggedExchange original) {
return transforms.stream().reduce(original, (o, t) -> t.apply(o), (m1, m2) -> m2);
}
L'esecuzione di questo in parallelo non ha senso, in quanto non v'è alcun modo per combinare due messaggi (lo (m1,m2) -> m2
è lì solo per rendere il compilatore felice).
C'è un modo migliore per farlo (come in qualche modo componendo tutti gli ConditionalTranforms
?) E in caso contrario, la funzione combiner
deve generare un'eccezione o qualcosa che non può supportare l'esecuzione parallela?
Il JavaDoc afferma che la maggior parte di queste operazioni dovrebbe essere possibile fare con map
e reduce
ma non vedo come.
Sei * richiesto * per utilizzare i flussi? – immibis
No, sono solo _tempted_ per usare gli stream :) – vertti
Non dovresti mai fornire un combinatore che faccia silenziosamente qualcosa, se * sai * che questo non è appropriato. Fornisci un combinatore * di lancio * se non hai davvero alternative. – Holger