2015-10-25 14 views
5

Làm thế nào tôi có thể thay thế mã này với mới Java Suối API:Làm thế nào để tạo ra IntStream sử dụng java dòng API

int n = someFunction(); // n > 0 
for (int i = 3; i * i <= n; i += 2) 
    System.out.print(i); 

tôi đã cố gắng sử dụng IntStream.iterate(3, i -> i + 2), nhưng tôi không thể thêm điều kiện dừng.

Vì tôi hiểu tôi không thể sử dụng phương thức .limit(int) tại đây.

Bất kỳ ý tưởng nào?

Trả lời

5

Bạn có thể sử dụng limit(int): bạn sẽ phải xác định có bao nhiêu yếu tố sẽ được từ 3 đến sqrt(n) bởi bước 2. Có chính xác (sqrt(n) - 3)/2 + 1 yếu tố, vì vậy bạn có thể viết:

IntStream.iterate(3, i -> i + 2).limit((int) (Math.sqrt(n) - 3)/2 + 1); 

Có nói đó, bạn cũng có thể tạo ra một loạt đóng 3-sqrt(n) và lọc ra các giá trị thậm chí, như thế này:

IntStream.rangeClosed(3, (int) Math.sqrt(n)).filter(i -> i % 2 > 0) 
+2

Rõ ràng đây vấn đề sẽ được giải quyết trong Java 9: ​​http: //stackoverflow.com/questions/20746429/limit-a-stream-by-a-predicate –

+2

Phiên bản phạm vi cũng sẽ cung cấp cho bạn nhiều hành vi song song tốt hơn (vì hai lý do; giới hạn song song là tốn kém và lặp lại() là một cách cơ bản tuần tự để tạo nguồn luồng.) –

2

Sử dụng miễn phí StreamEx thư viện của tôi hai giải pháp hơn là possi ble ngoài những người được đề xuất trong câu trả lời @Tunaki.

  1. Sử dụng backport của takeWhile phương pháp xuất hiện trong JDK-9:

    IntStream is = IntStreamEx.iterate(3, i -> i + 2).takeWhile(i -> i*i <= n); 
    
  2. Sử dụng ba lập luận IntStreamEx.rangeClosed cho phép để xác định các bước:

    IntStream is = IntStreamEx.rangeClosed(3, (int) Math.sqrt(n), 2); 
    
Các vấn đề liên quan