Lọc dòng dài [trùng lặp]
Tôi có hai dòng Java LongStream và tôi muốn xóa các giá trị có trong một dòng khỏi dòng kia.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
LongStream không có phương thức chứa và tôi không biết cách sử dụng anyMatch trong trường hợp này vì giá trị cần kiểm tra đến từ một luồng khác và không nằm trong một biến hoặc hằng số.
Trả lời
Chà, bạn không thể tìm kiếm trong Luồng miễn là Luồng là một tập hợp các đường ống chưa hoàn thành, tức là các hoạt động. Không có ý nghĩa gì khi so sánh nó với Stream như vậy.
Điều tiếp theo có vẻ kỳ lạ đối với tôi có lẽ là lỗi đánh máy. Tôi cho rằng bạn muốn tìm kiếm trong stream1thay stream2vì:
stream2 = stream2.filter(e -> stream1.contains(e));
Cách duy nhất là so sánh a LongStreamvới tập hợp được tối ưu hóa cho tìm kiếm như vậy. Tôi giả sử bạn muốn tiếp tục stream1sau khi thực hiện tìm kiếm, vì vậy hãy thực hiện các bước sau:
- Đóng
stream1chuyển đổi nó thành aList<Long> list1. - Thực hiện tìm kiếm
stream2bằng cách sử dụnglist1từstream1. - Mở
stream1lại để xử lý thêm.
LongStream stream1 = ...
LongStream stream2 = ...
List<Long> list1 = stream1.boxed() // list1 from stream1 ..
.collect(Collectors.toList()); // .. which also closes stream1
stream2 = stream2.filter(list1::contains); // perform search
stream1 = list1.stream().mapToLong(l -> l); // open stream1 as LongStream
Chỉnh sửa: Sử dụng Setđể có hiệu suất tốt hơn như @ fps gợi ý trong câu trả lời của anh ấy .
Bạn có thể thu thập vào một Setvà sử dụng contains:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Tại sao lại sử dụng luồng?
Bộ sưu tập có retainAll(Collection)phương pháp, đó là những gì bạn cần, nếu tôi không nhầm ...
(Hoặc removeAll(Collection)chỉ một chút ở trên ...)