Là Collection.stream (). Filter (). ForEach () không hiệu quả so với một tiêu chuẩn cho mỗi vòng lặp?


14

IntelliJ IDEA vừa được đề xuất với tôi để thay thế vòng lặp for-every sau đây bằng lệnh gọi "forEach" của Java 8:

    for (Object o : objects) {
        if (o instanceof SomeObject) {
            doSomething();
        }
    }

Cuộc gọi được đề xuất như thế này:

objects.stream().filter(o -> o instanceof SomeObject).forEach(o -> doSomething());

Trừ khi tôi hiểu nhầm chức năng cơ bản của Stream hoạt động như thế nào, thì dường như tôi sử dụng stream là một hoạt động O (2n) trái ngược với hoạt động O (n) cho vòng lặp chuẩn cho mỗi vòng lặp.


8
Tại sao bạn nghĩ đó là O ^ 2? Trong thực tế, các luồng được phát minh cụ thể để (a) cho phép cú pháp đẹp hơn và (b) không giới thiệu thêm chi phí. (Trên thực tế, họ thường giảm chi phí thông qua đánh giá lười biếng.)
Kilian Foth

Chỉ dựa trên cú pháp, có vẻ như lần đầu tiên lặp lại để lọc và sau đó lặp lại các đối tượng được lọc lần thứ hai để chạy mã của tôi.
đại lý 154

6
Ngay cả khi nó đã làm điều đó vẫn sẽ là O (2 * N), đó là O (N), tức là tuyến tính và không phải là bậc hai. Nhưng thực tế các lần lặp được xen kẽ với nhau và cả hai có thể chấm dứt sớm nếu kết quả đã được biết đến - đó là vẻ đẹp của các luồng. Thật đáng để dành 15 phút để đọc các luồng trong Java 8; như Venkat Subramaniam viết, '' Các biểu thức Lambda là liều thuốc cho Java 8, nhưng Luồng là nghiện thực sự. ''
Kilian Foth

1
Bên cạnh đó: vòng lặp của bạn là một antipotype;)
Thomas Junk

1
@ThomasJunk Bạn có thể giải thích làm thế nào nó là một antipotype? Tôi không quen thuộc với điều này.
đại lý 154

Câu trả lời:


20

Các luồng Java không lặp qua bộ sưu tập của bạn một lần cho mỗi câu lệnh, mặc dù cú pháp ngụ ý gì. Nó áp dụng toàn bộ chuỗi cho từng yếu tố, một yếu tố tại một thời điểm.

Trong trường hợp của bạn, luồng sẽ hoạt động chính xác như vòng lặp. Lấy một phần tử, kiểm tra nó dựa vào vị ngữ của bạn và sau đó áp dụng thao tác của bạn, sau đó chuyển sang phần tử tiếp theo.

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.