Làm thế nào để sắp xếp với luồng java 8 hoạt động dưới mui xe?


10

Khi tôi gọi Stream.sort(..)là có một mảng các phần tử mới được tạo và luồng lặp lại trên mảng được sắp xếp mới được tạo?

Nói cách khác, Java 8 Stream hoạt động như thế nào sortdưới mui xe?


Tại sao tôi lại bỏ phiếu với câu hỏi này ???
Được thông báo vào

2
Câu hỏi của bạn là hợp lý và không quan trọng của downvote. Nhận xét của bạn về câu trả lời của amon , tuy nhiên ... ugh: |
Andres F.

@AresresF. Việc bỏ phiếu đã đến ngay cả trước khi tôi đưa ra nhận xét đó. Đó là một trong những lý do tại sao tôi rất buồn.
Được thông báo vào

Các ý kiến ​​không có lý do để downvote, dù sao. Câu hỏi đứng trên giá trị riêng của nó, và theo tôi thì nó có giá trị. Tôi ủng hộ nó.
Andres F.

Câu trả lời:


10

Bạn có thể sử dụng grepcode.com để tìm kiếm thông qua mã thư viện chuẩn Java (và một số thư viện khác). Thật không may, mã thực hiện luồng khá trừu tượng. Một điểm khởi đầu tốt là java.util.stream.SortedOpslớp bên trong biến đổi một luồng thành một luồng được sắp xếp.

Việc triển khai hiện tại (được sử dụng cho các luồng của bộ chứa thư viện tiêu chuẩn) làm cho nó trở thành không có op nếu luồng đã được sắp xếp, sử dụng một mảng nếu kích thước của luồng được biết ( SizedRefSortingSink) hoặc tích lũy tất cả các phần tử trong ArrayList nếu kích thước là chưa biết ( RefSortingSink).

Tất nhiên, các chi tiết triển khai như vậy có thể thay đổi với bất kỳ bản phát hành nào, nhưng các cân nhắc cơ bản là phổ biến: Sắp xếp một luồng nhất thiết phải là một hoạt động háo hức / chặn và sắp xếp một luồng vô hạn là không có ý nghĩa. Điều này có nghĩa là sắp xếp một luồng không hữu ích nếu bạn sử dụng các luồng vì chúng có thể lười biếng, nhưng bạn vẫn nhận được cú pháp luồng thuận tiện.

Các luồng khác sẽ phải cung cấp việc thực hiện riêng của chúng Stream.sorted(), có thể sẽ tương tự.


1
@InformedA Tôi không muốn đề xuất rằng lambdas hoặc stream sẽ là những trò nhảm nhí dưới mũ trùm đầu. Cả hai đều rất tiện lợi, mặc dù các chi tiết liên quan đến các luồng phức tạp khác thường so với các khái niệm Java khác. Nếu bạn muốn bám vào quan niệm được hình thành từ trước rằng những công cụ này là vô dụng hoặc có hại, bạn không cần thiết phải giới hạn bản thân.
amon

1
@amon - đã đồng ý, cộng với các luồng cung cấp khả năng triển khai song song đa lõi trong phần mềm, mà hầu như không thay đổi ứng dụng. Và sự phức tạp của việc thực hiện luồng chính xác đến từ đó. Đó không chỉ là sự tiện lợi, đó là sự trừu tượng đúng đắn. Đối với OP - Tôi khuyên bạn nên đọc Mastering Lambdas ... nếu bạn muốn hiểu tại sao lambdas và stream lại nhiều hơn thế chỉ là các tính năng tiện lợi.
Yuri Steinschreiber

3
@InformedA: lambdas đã tồn tại được 80 năm và tồn tại trong hầu hết mọi ngôn ngữ lập trình chính thống hiện nay. Các luồng đã tồn tại được 40 năm và tương tự tồn tại trong hầu hết các khung bộ sưu tập chính thống. Chúng có thể được gọi là những thứ khác nhau (lặp, danh sách lười biếng, liệt kê, liệt kê), nhưng chúng ở đó. Lambdas và danh sách lười biếng là một số trừu tượng lâu đời nhất và ổn định nhất, và chúng đã tồn tại qua mọi mốt, cường điệu, mô hình, chuyển động, phương pháp, công nghệ, ngôn ngữ, hệ điều hành, khung, thư viện ném vào chúng. Điều đó làm cho chúng đáng xem.
Jörg W Mittag

2
@InformedA Java, ngôn ngữ lập trình, chỉ là một sự trừu tượng nhảm nhí của mã byte chạy trên JVM. Bản thân JVM chỉ là một sự trừu tượng nhảm nhí được viết bằng C (hoặc C ++, tôi quên). C và C ++ chỉ là sự trừu tượng nhảm nhí so với ngôn ngữ lắp ráp. Ngay cả ngôn ngữ lắp ráp cũng là một sự trừu tượng nhảm nhí đối với microcode, đây cũng là một sự trừu tượng nhảm nhí trên các mạch (ok, tôi có thể thiếu một vài bước ở giữa). Bạn có thể nói mọi thứ hữu ích trong phần mềm là một sự "trừu tượng nhảm nhí" so với những thứ khác.
Andres F.

3
@InformedA Lời khuyên chân thành của tôi là bạn hãy thử học một ngôn ngữ thiên về lập trình chức năng hơn Java. Ngay cả khi bạn không bao giờ sử dụng nó cho công việc hàng ngày của mình, bạn sẽ hiểu ngôn ngữ lập trình và các lựa chọn thiết kế của chúng sẽ giúp bạn với Java :)
Andres F.
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.