Giả sử tôi có một luồng điều và tôi muốn "làm phong phú" chúng giữa dòng, tôi có thể sử dụng peek()
để làm điều này, ví dụ:
streamOfThings.peek(this::thingMutator).forEach(this::someConsumer);
Giả sử rằng việc thay đổi Điều ở thời điểm này trong mã là hành vi đúng - ví dụ: thingMutator
phương thức có thể đặt trường "LastProcessed" thành thời điểm hiện tại.
Tuy nhiên, peek()
trong hầu hết các bối cảnh có nghĩa là "nhìn, nhưng đừng chạm vào".
Là sử dụng peek()
để đột biến các yếu tố dòng một antipotype hoặc không khuyến khích?
Chỉnh sửa:
Cách tiếp cận khác, thông thường hơn sẽ là chuyển đổi người tiêu dùng:
private void thingMutator(Thing thing) {
thing.setLastProcessed(System.currentTimeMillis());
}
đến một hàm trả về tham số:
private Thing thingMutator(Thing thing) {
thing.setLastProcessed(currentTimeMillis());
return thing;
}
và sử dụng map()
thay thế:
stream.map(this::thingMutator)...
Nhưng điều đó giới thiệu mã chiếu lệ ( return
và) và tôi không tin nó rõ ràng hơn, bởi vì bạn biết peek()
trả về cùng một đối tượng, nhưng với map()
một cái nhìn thậm chí không rõ ràng rằng đó là cùng một loại đối tượng.
Hơn nữa, với peek()
bạn có thể có một lambda đột biến, nhưng với map()
bạn phải xây dựng một con tàu đắm. Đối chiếu:
stream.peek(t -> t.setLastProcessed(currentTimeMillis())).forEach(...)
stream.map(t -> {t.setLastProcessed(currentTimeMillis()); return t;}).forEach(...)
Tôi nghĩ rằng peek()
phiên bản rõ ràng hơn và lambda rõ ràng đang biến đổi, vì vậy không có tác dụng phụ "bí ẩn". Tương tự, nếu một tham chiếu phương thức được sử dụng và tên của phương thức ngụ ý rõ ràng đột biến, thì điều đó cũng rõ ràng và rõ ràng.
Về lưu ý cá nhân, tôi không ngại sử dụng peek()
để biến đổi - tôi thấy nó rất tiện lợi.
peek
với một luồng tạo các phần tử của nó một cách linh hoạt chưa? Nó vẫn hoạt động, hoặc những thay đổi bị mất? Sửa đổi các yếu tố của một luồng âm thanh không đáng tin cậy đối với tôi.
List<Thing> list; things.stream().peek(list::add).forEach(...);
rất tiện dụng. Gần đây. Tôi đã sử dụng nó để thêm thông tin để xuất bản : Map<Thing, Long> timestamps = ...; return things.stream().peek(t -> t.setTimestamp(timestamp.get(t))).collect(toList());
. Tôi biết có nhiều cách khác để làm ví dụ này, nhưng tôi đơn giản hóa quá mức ở đây. Sử dụng peek()
sản xuất nhỏ gọn hơn, và mã thanh lịch hơn IMHO. Dễ đọc sang một bên, câu hỏi này thực sự là về những gì bạn đã nêu ra; nó có an toàn / đáng tin cậy không?
peek
? Tôi có câu hỏi tương tự trên stackoverflow và hy vọng bạn có thể xem nó và đưa ra phản hồi của bạn. Cảm ơn. stackoverflow.com/questions/47356992/