Il modo migliore per farlo con i flussi è utilizzare reduce
:
// make a transformer that combines all of them as one
Transformer combinedTransformer =
// the stream of transformers
transformers.stream()
// combine all the transformers into one
.reduce(
// apply each of the transformers in turn
(t1, t2) -> x -> t2.apply(t1.apply(x)))
);
// the stream of strings
strings.stream()
// transform each string with the combined transformer
.map(combinedTranformer::apply);
Naturalmente, ciò presuppone che transformers
non è vuota; se v'è una possibilità che è vuota, che è abbastanza semplice da usare sovraccarico due argomenti di reduce
invece, in questo modo (ciò presuppone Tranformer
è un'interfaccia funzionale):
// make a transformer that combines all of them as one
Transformer combinedTransformer =
// the stream of transformers
transformers.stream()
// combine all the transformers into one
.reduce(
// the no-op transformer
x -> x,
// apply each of the transformers in turn
(t1, t2) -> x -> t2.apply(t1.apply(x)))
);
// the stream of strings
strings.stream()
// transform each string with the combined transformer
.map(combinedTranformer::apply);
La ragione hai un errore del compilatore è che, come dice l'errore, le variabili esterne usate in un'espressione lambda devono essere in modo efficace finale; ovvero, dichiarandoli final
(se non lo sono già) non è necessario modificare il significato del programma, o cambiarne la compilazione. Pertanto, l'utilizzo di un'assegnazione mutabile in una lambda è generalmente vietato, e con buone ragioni: la mutazione aumenta la parallelizzazione e uno dei motivi principali per cui lambda era incluso in Java 8 era quello di consentire una programmazione parallela più semplice.
In generale, ogni volta che si desidera "sommare" i risultati in qualche modo, reduce
(in uno dei suoi tre sovraccarichi) è il metodo go-to. Imparare a usare map
, filter
, reduce
e flatMap
è molto importante quando si lavora con Stream
s.
fonte
2014-05-04 00:05:30
Potrebbe essere utile includere il testo dell'errore del compilatore. – MatrixFrog
Errore: (49, 60) java: le variabili locali a cui fa riferimento un'espressione lambda devono essere definitive o effettivamente definitive –
Questa domanda è molto buona; tuttavia, suggerirei che dovrebbe essere spostato su Stack Overflow. –