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
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
Bên cạnh đó: vòng lặp của bạn là một antipotype;)
—
Thomas Junk
@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