2014-10-26 17 views
14

Làm thế nào tôi có thể đạt được một cách đơn giản một danh sách lười biếng trong Kotlin? (Ví dụ, danh sách số nguyên lười biếng). Tôi đã tìm kiếm trên tài liệu chính thức, tôi đã googling cho rằng không có kết quả nhất quán. Có lẽ hướng dẫn tốt nhất tôi đã tìm thấy là một: enter link description here, nhưng tôi tự hỏi nếu có một "con đường bản địa kotlin" để làm điều đó, hoặc tôi phải thực hiện nó bản thân mình với các liên kết tôi vừa đưa ra.Danh sách lười biếng trong kotlin?

tôi đã tìm thấy sau đây trên blog chính thức Kotlin, mặc dù tôi đã không thể có được một mục, với số nguyên [3] ví dụ

var i = 0 
integers = iterate{i++} 

integers[3] // does not work 
integers drop 3 // works 
+0

Dường như lặp lại không còn được dùng nữa, nhưng tôi cũng có thể nhận luồng nhờ chức năng streamOf (initialValue, closureForNext). Đối với toán tử dấu ngoặc đơn, tôi có thể kết nối luồng của mình vào một lớp và triển khai phương thức get (index). Đơn giản như thế này. Tôi có thể "cứu" câu hỏi này, theo tôi. – loloof64

+0

Có thể trùng lặp [Định nghĩa đệ quy của chuỗi vô hạn trong Kotlin] (http://stackoverflow.com/questions/35142548/recursive-definition-of-infinite-sequence-in-kotlin) – Vadzim

+2

No. Câu hỏi của tôi đã được hỏi trước đây. – loloof64

Trả lời

16

Khi bạn quan sát một cách chính xác, sequenceOf (streamOf() trong phiên bản cũ) là cách để có được một luồng số lười. Không giống như Haskell, không có thứ gì như một danh sách lười biếng trong thư viện chuẩn của Kotlin, và vì một lý do chính đáng: ý nghĩa chính của "danh sách" trong thế giới Haskell và thế giới Java là khác nhau. Trong Haskell, một danh sách chủ yếu là một danh sách liên kết, một cặp đầu và đuôi, và hoạt động chính là lấy một đầu của danh sách như vậy, đó là đơn giản để thực hiện một cách hiệu quả lười biếng. Trong Kotlin/Java, danh sách là một cấu trúc dữ liệu với truy cập ngẫu nhiên vào các phần tử của nó, và hoạt động chính là get(int), có thể được thực hiện một cách lười biếng, tất nhiên, nhưng hiệu suất của nó thường gây ngạc nhiên cho người dùng. Vì vậy, Kotlin sử dụng luồng cho sự lười biếng, vì chúng rất tốt khi nói đến các trường hợp sử dụng chính của các bộ sưu tập lười biếng: lặp lại, lọc, ánh xạ và truy cập ngẫu nhiên thường không gặp phải thường xuyên. Quay lại đầu trang |

Như bạn, một lần nữa, quan sát chính xác, drop cho phép bạn truy cập các phần tử theo chỉ mục, điều này làm cho các hàm ý hiệu suất rõ ràng hơn trong mã.

BTW, trường hợp sử dụng của bạn cho danh sách lười biếng là gì?

+0

Tôi đang sử dụng danh sách lười biếng để xử lý hàm bậc cao hơn, tính toán số fibonnaci. Vì vậy, tôi có thể đi xa hơn với chuỗi fibonacci này: tổng của n số chẵn chẳng hạn. – loloof64

+10

Các luồng trong Kotlin đã được thay thế bằng 'Chuỗi ký tự 'để tránh xung đột với luồng Java 8. Tham chiếu đến 'streamOf' bằng' sequenceOf' hoặc để chuyển đổi một tập hợp khác thành chuỗi 'asSequence' –

+0

Documents: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.sequences/ – Vadzim

Các vấn đề liên quan