2015-12-06 30 views
9

Giả sử tôi có danh sách các thành phần kích thước 30k và tôi muốn thực hiện thao tác trên tất cả các cặp có thể trong danh sách. Vì vậy, tôi có:Kotlin flatMap - bản đồ

list.asSequence().flatMap { i -> 
     list.asSequence().map { j -> /* perform operation here */ } 
} 

Câu hỏi 1: Có điều gì mà tôi có thể sử dụng như là một thay thế? (Chẳng hạn như functors ứng dụng).

Tôi cũng nhận thấy rằng thao tác bản đồ phẳng sơ đồ này chậm hơn đáng kể so với phiên bản vòng lặp bắt buộc. (Có lẽ do đóng cửa?)

for(i in list){ 
    for(j in list){ 

    } 
} 

Câu hỏi 2: Có cách nào để cải thiện hiệu suất của phiên bản/bản đồ flatMap?

Trả lời

1

trả lời cho câu hỏi 2, chúng tôi đang cân nhắc để thêm flatMap quá tải mà không tạo ra đóng cửa cho mỗi phần tử trong bộ sưu tập bên ngoài/chuỗi: https://youtrack.jetbrains.com/issue/KT-8602

Nhưng trong trường hợp nếu bạn muốn thực hiện một số tác dụng phụ trên mỗi cặp, thay vì chuyển đổi chuỗi, tôi khuyên bạn nên gắn bó với các vòng for hoặc inline forEach lambdas, có hiệu quả giống nhau.

+0

Cảm ơn bạn đã đề xuất :) Tôi sẽ rất vui nếu KT-8602 này được xem xét, hoặc một cái gì đó giống như một danh sách lồng nhau, thực sự mong đợi nó –

2

Một số lựa chọn thay thế với những tác động hiệu suất:

  1. com.google.common.collect.Sets.cartesianProduct(java.util.Set...): "Returns mỗi danh sách có thể có thể được hình thành bằng cách chọn một phần tử từ mỗi bộ được đưa ra trong trật tự; các 'n-ary Cartesian product' của bộ . "
    • Điều này yêu cầu các thành phần danh sách của bạn phải là duy nhất. Nếu không thì bạn phải quấn từng phần tử trong một đối tượng duy nhất để tất cả chúng có thể được thêm vào bộ đầu vào. Tuy nhiên, trong thử nghiệm của tôi, tôi thấy nó chậm hơn giải pháp flatMap/map. :-(
  2. forEach/forEach: Như bạn chỉ muốn thực hiện một thao tác trên mỗi cặp sau đó bạn không thực sự cần phải sử dụng flatMap hoặc map để chuyển danh sách, do đó bạn có thể sử dụng forEach/forEach thay vì:

    list.forEach { i -> 
        list.forEach { j -> /* perform operation here */ } 
    } 
    
    • Trong thử nghiệm của tôi, tôi đã tìm thấy điều này là nhanh hơn so với giải pháp for/for hơi. :-)

Nếu bạn cần chuyển đổi danh sách thì giải pháp flatMap/map của bạn dường như là giải pháp tốt nhất.

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