Cách tốt nhất để làm điều này với con suối là sử dụng 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);
Tất nhiên, điều này giả định rằng transformers
không bị để trống; nếu có một khả năng rằng nó là trống rỗng, hơn nó là đủ đơn giản để sử dụng quá tải hai đối số của reduce
thay vào đó, như vậy (điều này giả định Tranformer
là một giao diện chức năng):
// 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);
Lý do bạn có một lỗi biên dịch là, như lỗi nói, các biến bên ngoài được sử dụng trong một biểu thức lambda phải là hiệu quả cuối cùng; có nghĩa là, tuyên bố chúng final
(nếu chúng chưa có) không được thay đổi ý nghĩa của chương trình, hoặc thay đổi hay không biên dịch. Do đó, việc sử dụng một phép gán mutable trong lambda thường bị cấm, và với lý do chính đáng: các vít đột biến lên song song, và một trong những lý do chính lambdas được đưa vào Java 8 là cho phép lập trình song song dễ dàng hơn.
Nói chung, bất cứ khi nào bạn muốn "tổng hợp" kết quả theo một cách nào đó, reduce
(trong bất kỳ ba quá tải nào của nó) là phương pháp truy cập của bạn. Tìm hiểu cách sử dụng map
, filter
, reduce
và flatMap
hiệu quả là rất quan trọng khi làm việc với Stream
s.
Nguồn
2014-05-04 00:05:30
Nó có thể giúp đưa văn bản của lỗi trình biên dịch vào. – MatrixFrog
Lỗi: (49, 60) java: biến cục bộ được tham chiếu từ biểu thức lambda phải là kết quả cuối cùng hoặc hiệu quả –
Câu hỏi này rất hay; Tuy nhiên, tôi sẽ đề nghị rằng nó nên được chuyển đến Stack Overflow. –