Đó là n ot rất khó khăn để thực hiện một xác foldLeft
cho Java 8 suối:
@SuppressWarnings("unchecked")
public static <T, U> U foldLeft(Stream<T> stream,
U identity, BiFunction<U, ? super T, U> accumulator) {
Object[] result = new Object[] { identity };
stream.forEachOrdered(t -> result[0] = accumulator.apply((U) result[0], t));
return (U) result[0];
}
Hoặc trong kiểu an cách:
public static <T, U> U foldLeft(Stream<T> stream,
U identity, BiFunction<U, ? super T, U> accumulator) {
class Box {
U value;
Box(U value) { this.value = value; }
}
Box result = new Box(identity);
stream.forEachOrdered(t -> result.value = accumulator.apply(result.value, t));
return result.value;
}
này hoạt động một cách chính xác cho dòng tuần tự và song song. Bạn thậm chí có thể đạt được tốc độ sử dụng các luồng song song nếu luồng của bạn có một số hoạt động trung gian không sử dụng CPU như map
: trong trường hợp này, phần tử tiếp theo có thể được xử lý bởi map
song song với phần tử hiện tại được xử lý bởi foldLeft
. Tôi không đồng ý rằng hoạt động như vậy không phù hợp với API luồng vì nó có thể được thể hiện chính xác qua số đã tồn tại forEachOrdered
.
tôi có hoạt động này trong thư viện StreamEx tôi, vì vậy bạn có thể sử dụng nó như thế này:
WebTarget target = EntryStream.of(queryParams).foldLeft(getClient().target(u),
(t, entry) -> t.queryParam(entry.getKey(), entry.getValue()))
Nguồn
2015-06-09 18:06:41
Tôi lo lắng về điều đó kết hợp cuối cùng, ngay cả khi bạn thêm 'tuần tự() '. –
Tôi cũng thế. Tôi không chắc nó đúng. Không có bất kỳ tương đương với 'foldLeft', tôi nghi ngờ API luồng phù hợp trong tình huống này. – aioobe
Tôi nghĩ rằng tôi thích một câu trả lời hoàn toàn tuyên bố rằng các luồng không thực sự hỗ trợ tốt điều này. –