Giả sử tôi có một số Collection
và Predicate
khớp với các yếu tố tôi muốn xóa khỏi Collection
. Nhưng tôi không chỉ muốn loại bỏ chúng, tôi muốn di chuyển các yếu tố phù hợp vào một bộ sưu tập mới. Tôi muốn làm một cái gì đó như this trong Java 7:Xóa và thu thập các phần tử bằng luồng Java
List<E> removed = new LinkedList<>();
for (Iterator<E> i = data.iterator(); i.hasNext();) {
E e = i.next();
if (predicate.test(e)) {
removed.add(e);
i.remove();
}
}
Tôi tò mò nếu có một luồng/Java 8 cách để làm điều đó. Collections.removeIf()
may đơn giản là trả về một boolean
(thậm chí không đếm số lượng các yếu tố loại bỏ Quá xấu?). Tôi hình dung một cái gì đó như thế này (mặc dù dĩ nhiên .removeAndYield(Predicate)
không tồn tại):
List<E> removed = data.removeAndYield(predicate).collect(Collectors.toList());
Lưu ý: Câu hỏi này là lấy cảm hứng từ a similar question; câu hỏi này là về trường hợp tổng quát hơn khi nhận luồng trên các mục bị xóa khỏi bộ sưu tập. Như đã chỉ ra trong câu hỏi được liên kết, giải pháp bắt buộc có thể dễ đọc hơn, nhưng tôi tò mò nếu điều này thậm chí có thể với các luồng.
Chỉnh sửa: Rõ ràng chúng tôi có thể chia nhiệm vụ thành hai bước riêng biệt và giả định cấu trúc dữ liệu thích hợp sẽ hiệu quả. Câu hỏi đặt ra là điều này có thể được thực hiện trên các bộ sưu tập tùy ý (có thể không có hiệu quả .contains()
vv).
Khó khăn là bạn không thể xóa các phần tử từ một 'Bộ' trong khi lặp lại nó mà không nhận được' ConcurrentModificationException', vì vậy bất kỳ cách Java 8 nào cũng sẽ yêu cầu ít nhất hai lần lặp lại như trong câu trả lời của Misha. AFAIK cách duy nhất để làm điều này với một lần lặp duy nhất của 'set' là sử dụng một' Iterator' rõ ràng. –
Bạn có thể với một 'Iterator' trên' Bộ sưu tập', điều này cho thấy nó có thể có khái niệm với một 'Dòng'. Rõ ràng điều đó không có nghĩa là nó có sẵn trong hộp, nhưng có lẽ nó không phức tạp để làm. Hoặc có thể có lý do chính đáng mà nó không có trong JDK. – dimo414
Ví dụ "Java 7" trong câu hỏi của tôi thể hiện việc loại bỏ các phần tử giữa lần lặp lại. Nếu chúng ta có thể làm điều đó trong một đường chuyền một cách bất hợp pháp, nó có thể được thực hiện một cách có chức năng không? – dimo414