2017-07-04 42 views
5

Làm thế nào tôi có thể vượt qua biểu thức lambda tham số như tùy chọn trong Kotlin ngôn ngữbiểu thức lambda Kotlin như tham số tùy chọn

val max = { a: Int, b: Int -> 
    if (a > b) 
     a 
    else 
     b 
} 

tôi phải vượt qua trên điều cũng giống như tham số tùy chọn

+1

Bạn muốn truyền lambda này cho ai? – zsmb13

+0

Lưu ý phụ, đã có hàm 'max' có sẵn trong JDK, có thể truy cập thông qua' Math.max (a, b) 'làm điều tương tự. – Robin

+0

Về câu hỏi của bạn mặc dù, tôi không thực sự hiểu những gì bạn đang yêu cầu - bạn có thể vượt qua 'max' như một đối số bình thường cho bất kỳ cuộc gọi chức năng mà có một chức năng của các hình thức' (Int, Int) -> Int'. – Robin

Trả lời

0

Bạn có thể sử dụng của bạn max hoạt động như mặc định

fun someDefault(f: (a: Int, b: Int) -> Int = max) { 
    f(1, 7) 
    // do something 
} 

hoặc bạn cũng có thể định nghĩa một phương thức với lambda như tham số đó là không bắt buộc

fun someOptional(f: ((a: Int, b: Int) -> Int)? = null) { 
    f?.invoke(1, 7) 
} 

Trong cả hai trường hợp (mặc định và tùy chọn), bạn có thể chỉ định một lambda cho cuộc gọi hoặc bạn chỉ có thể bỏ qua nó

fun call() { 
    someDefault() 
    someDefault { a, b -> a * b} 

    someOptional() 
    someOptional { a, b -> a * b} 
} 
5

Phần sau định nghĩa một hàm chấp nhận hàm và chỉ định giá trị mặc định cho hàm được truyền nếu không có hàm nào được cung cấp.

fun foobar(fn: (a: Int, b: Int) -> Int = { a: Int, b: Int -> if (a > b) a else b }) { 
    println(fn(42, 99)) 
} 

Bạn có thể vượt qua các chức năng của riêng bạn:

val min = { a: Int, b: Int -> if (a <= b) a else b } 
foobar(min) 

val max = { a: Int, b: Int -> if (a > b) a else b } 
foobar(max) 

Bạn có thể bỏ qua các chức năng và sử dụng mặc định:

foobar() 

Hoặc bạn có thể tham khảo các tiêu chuẩn thư viện maxOf chức năng như mặc định, thay vì viết của riêng bạn:

fun foobar(fn: (a: Int, b: Int) -> Int = ::maxOf) { 
    println(fn(42, 99)) 
}