2017-02-27 56 views
7

Cho phép records là luồng/bộ sưu tập và extract chức năng chuyển đổi dữ liệu tạo thành một phần tử của bộ sưu tập đó.Tham chiếu chức năng Kotlin

Có cách nào trong Kotlin viết

records.map {extract(it)} 

mà không explicitely áp dụng (it)?

Ví dụ: records.map(extract) hoặc records.map {extract}

Trả lời

10
  • Nếu extract là một giá trị (biến cục bộ, tài sản, tham số) của một loại chức năng (T) -> R hoặc T.() -> R đối với một số TR, sau đó bạn có thể chuyển trực tiếp hình ảnh đó tới map:

    records.map(extract) 
    

    Ví dụ:

    val upperCaseReverse: (String) -> String = { it.toUpperCase().reversed() } 
    
    listOf("abc", "xyz").map(upperCaseReverse) // [CBA, ZYX] 
    
  • Nếu extract là một top-level chức năng đối số duy nhất hoặc một hàm đối số duy nhất địa phương, bạn có thể make a function reference as ::extract và vượt qua nó để map:

    records.map(::extract) 
    

    Ví dụ :

    fun rotate(s: String) = s.drop(1) + s.first() 
    
    listOf("abc", "xyz").map(::rotate) // [bca, yzx] 
    
  • Nếu là thành viên hoặc chức năng mở rộng của lớp SomeClass không chấp nhận đối số hoặc thuộc tính của SomeClass, bạn có thể sử dụng nó làm SomeClass::extract. Trong trường hợp này, records phải chứa các mục của SomeType, sẽ được sử dụng làm bộ thu cho extract.

    records.map(SomeClass::extract) 
    

    Ví dụ:

    fun Int.rem2() = this % 2 
    
    listOf("abc", "defg").map(String::length).map(Int::rem2) // [1, 0] 
    
  • Kể từ Kotlin 1.1, nếu extract là thành viên hoặc một chức năng mở rộng của một lớp SomeClass chấp nhận một đối số, bạn có thể make a bound callable reference với một số nhận foo:

    records.map(foo::extract) 
    records.map(this::extract) // to call on `this` receiver 
    

    Ví dụ:

    listOf("abc", "xyz").map("prefix"::plus) // [prefixabc, prefixxyz] 
    

(runnable demo with all the code samples above)

1

bạn có thể sử dụng tham chiếu phương pháp (tương tự như Java).

records.map {::extract} 

hãy nhìn vào các chức năng tham chiếu ví dụ về tài liệu Kotlin https://kotlinlang.org/docs/reference/reflection.html#function-references

+4

Mã này không làm những gì nó được dự định. Mỗi mục của 'records' sẽ được ánh xạ tới tham chiếu hàm, và bạn sẽ nhận được một danh sách N mục giống hệt nhau' :: extract'. – hotkey

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