Lọc dòng dài [trùng lặp]

Dec 01 2020

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

1 NikolasCharalambidis Dec 01 2020 at 13:59

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:

  1. Đóng stream1chuyển đổi nó thành a List<Long> list1.
  2. Thực hiện tìm kiếm stream2bằng cách sử dụng list1từ stream1.
  3. 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 .

3 fps Dec 01 2020 at 13:48

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);
1 UsagiMiyamoto Dec 01 2020 at 14:17

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 ...)