Làm cách nào tôi có thể bỏ qua cuộc gọi giới hạn (số) với một luồng khi số đó bằng 0?


19

Tôi có một số mã Java cung cấp các đối tượng từ items. Nó giới hạn họ dựa trên maxNumber:

items.stream()
     .map(this::myMapper)
     .filter(item -> item != null)
     .limit(maxNumber)
     .collect(Collectors.toList());

Nó hoạt động đúng, nhưng câu hỏi là: Có cách nào bỏ qua giới hạn khi maxNumber == 0không?

Tôi biết tôi có thể làm điều này:

if (maxNumber == 0) {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .collect(Collectors.toList());
} else {
    items.stream()
         .map(this::myMapper)
         .filter(item -> item != null)
         .limit(maxNumber)
         .collect(Collectors.toList());
}

Nhưng có lẽ có một cách tốt hơn, có gì đến với tâm trí của bạn không?

Câu trả lời:


15

Tôi cho rằng

.limit(maxNumber == 0 ? Long.MAX_VALUE : maxNumber)

sẽ thực hiện thủ thuật này, vì rất có khả năng là bạn sẽ xử lý một luồng có nhiều hơn 2 ^ 63-1 phần tử ...

Ít nhất hãy cẩn thận với các luồng song song về điều này ... Một lưu ý trong tài liệu API nói:

Lưu ý API : Mặc dù limit()nói chung là một hoạt động rẻ tiền trên các đường ống dòng tuần tự, nhưng nó có thể khá tốn kém trên các đường ống song song được đặt hàng, đặc biệt đối với các giá trị lớn của maxSize ...


Vâng, đó là mẹo, cảm ơn!
Randomuser1

20

Không, đường ống luồng không cho phép thực sự bỏ qua bất kỳ phần nào của đường ống, vì vậy bạn buộc phải làm việc với logic có điều kiện bên trong các bước và bao gồm limit()luôn luôn trong đường ống hoặc xây dựng luồng theo các phần sẽ là dễ đọc hơn một chút (IMHO) so với if / other trong câu hỏi

Stream<Item> s = items.stream()
         .map(this::myMapper)
         .filter(Objects::nonNull);

if(maxNumber > 0) {
    s = s.limit(maxNumber);
}

List<Item> l = s.collect(Collectors.toList());

Trong một trường hợp đơn giản như ở đây, nó không tạo ra nhiều khác biệt, nhưng bạn thường thấy trong các bộ sưu tập mã thông thường được truyền qua các phương thức, được chuyển đổi thành luồng và sau đó quay lại bộ sưu tập. Trong những trường hợp như vậy, có thể là một ý tưởng tốt hơn để làm việc với các luồng trong các phần cho đến khi bạn thực sự cần collect().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.