Tôi có một danh sách các số có số 0s
bên trong. Vì 0
có nghĩa là số đo không hợp lệ trong trường hợp của tôi, tôi cần thay đổi thành phần có giá trị 0
với phần tử không phải 0 đầu tiên mà tôi có thể tìm thấy ở các vị trí trước đó.Luồng Java Sử dụng phần tử trước trong Foreach Lambda
Ví dụ danh sách
45 55 0 0 46 0 39 0 0 0
phải trở thành
45 55 55 55 46 46 39 39 39 39
Đây là thực hiện bằng cách sử dụng cổ điển for each
int lastNonZeroVal = 0;
for (MntrRoastDVO vo : res) {
if (vo.getValColor() > 0) {
lastNonZeroVal = vo.getValColor();
} else {
vo.setValColor(lastNonZeroVal);
}
}
Có cách nào để thực hiện điều này với Streams Java và Hàm Lambda?
Vì tôi biết rằng tôi không được thay đổi nguồn của luồng trong lambda foreach, nên danh sách là danh sách đối tượng và tôi không thay đổi phần tử của danh sách nhưng tôi chỉ gán giá trị mới.
Đây là giải pháp đầu tiên của tôi
int lastNonZeroVal = 1;
resutl.stream().forEach(vo -> {
if(vo.getValColor()>0){
lastNonZeroVal=vo.getValColor();
}else{
vo.setValColor(lastNonZeroVal);
}
});
Nhưng tôi cũng đọc here
Tốt nhất là nếu lambdas truyền cho dòng hoạt động hoàn toàn bên hiệu lực thi hành miễn phí. có nghĩa là, họ không biến đổi bất kỳ trạng thái heapbased nào hoặc thực hiện bất kỳ I/O nào trong quá trình thực hiện.
Đây là những gì tôi worryng
dữ liệu được phân chia, không có đảm bảo rằng khi một yếu tố nhất định là xử lý, tất cả các yếu tố trước yếu tố đó đã được xử lý.
Giải pháp này có thể tạo ra kết quả không hợp lệ, có thể khi số lượng thành phần trong danh sách cao? ? Sự kiện nếu tôi không sử dụng parallelStream()
?
có thể cho kết quả không chính xác nếu luồng chứa số âm .... trường hợp còn lại có vẻ tốt ... – Rishi
Tại sao bạn muốn sử dụng cấu trúc không gian (luồng) cho hoạt động có trạng thái? – Spotted
Tôi đoán đây chính xác là lỗi của tôi, luồng không phải là giải pháp phù hợp trong trường hợp này – Panciz