2017-08-17 68 views
11

Tôi không hiểu sự khác biệt thực sự giữa dấu ngoặc nhọn và dấu ngoặc bình thường trong Kotlin khi sử dụng RxJava. Ví dụ, tôi có đoạn mã sau đó hoạt động như mong đợi:Sự khác biệt giữa dấu ngoặc nhọn và dấu ngoặc vuông trong RxJava với Kotlin

someMethodThatReturnsCompletable() 
    .andThen(anotherMethodThatReturnsACompletable()) 
    .subscribe(...) 

Nhưng sau không làm việc:

someMethodThatReturnsCompletable() 
    .andThen { anotherMethodThatReturnsACompletable() } 
    .subscribe(...) 

Lưu ý sự khác biệt trong andThen() một phần của chuỗi với dấu ngoặc nhọn. Tôi không thể hiểu được sự khác biệt giữa hai người. Tôi đã xem xét một số bài viết nhưng tiếc là tôi vẫn gặp khó khăn trong việc hiểu sự khác biệt tinh tế này.

+0

Câu hỏi của tôi không phải là về hành vi - nhưng sự khác biệt giữa hai dấu ngoặc ôm - cách/tại sao chúng khác nhau trong trường hợp này? – blackpanther

Trả lời

5

Các đoạn mã đầu tiên thực hiện anotherMethodThatReturnsACompletable() và vượt qua giá trị trở lại andThen(), trong đó thông số Completable được chấp nhận làm thông số.

Trong đoạn mã thứ hai, bạn đang viết một hàm theo nghĩa đen là lambda expression. Nó chuyển một hàm của loại () -> Unit đến andThen(), mà nó cũng là một câu lệnh hợp lệ, nhưng mã bên trong lambda có thể không được gọi.

Trong Kotlin, có một quy ước rằng nếu tham số cuối cùng để một chức năng là một chức năng, và bạn đang đi qua một biểu thức lambda như là đối số tương ứng, bạn có thể xác định nó bên ngoài dấu ngoặc đơn:

lock (lock) { 
    sharedResource.operation() 
} 

Kể từ hỗ trợ Kotlin SAM conversion,

Điều này có nghĩa rằng Kotlin chức năng literals có thể được tự động chuyển sang triển khai các giao diện Java với một phương thức không mặc định duy nhất, miễn là các kiểu tham số của phương thức giao diện khớp với các kiểu tham số của hàm Kotlin.

Nhìn lại để Completable, có một số quá tải andThen() chức năng:

andThen(CompletableSource next) 
andThen(MaybeSource<T> next) 
andThen(ObservableSource<T> next) 
andThen(org.reactivestreams.Publisher<T> next) 
andThen(SingleSource<T> next) 

Ở đây bạn có thể chỉ định Type SAM bằng cách gọi:

andThen(CompletableSource { 
    //implementations 
}) 
1

.andThen(anotherMethodThatReturnsACompletable()) có nghĩa là kết quả của anotherMethodThatReturnsACompletable() sẽ được chuyển đến andThen()

.andThen { anotherMethodThatReturnsACompletable() } nghĩa là lambda, mà thực hiện anotherMethodThatReturnsACompletable() sẽ được chuyển đến andThen()

3

Như bạn có thể biết rằng trong Java () dấu ngoặc đơn được sử dụng để truyền tham số và các dấu ngoặc đơn được sử dụng cho thân phương thức và cũng đại diện cho phần thân của biểu thức lambda.

Vì vậy, cho phép so sánh:

  1. .andThen(anotherMethodThatReturnsACompletable()): đây andThen() phương pháp chấp nhận Completable nên andThen sẽ tiết kiệm được tham chiếu đến completable trả về bởi anotherMethodThatReturnsACompletable() phương pháp để đăng ký sau.

  2. .andThen { anotherMethodThatReturnsACompletable() }: Biểu thức này chuyển biểu thức lambda đến phương thức AndThen. Ở đây anotherMethodThatReturnsACompletable() không được gọi tại thời điểm truyền lambda. anotherMethodThatReturnsACompletable() sẽ được gọi khi hàm lambda được gọi trong phương thức andThen.

Hy vọng nó giúp.

0

() -> Bạn đang đi qua một cái gì đó bên trong chúng ví dụ: chức năng lập luận

{} -> Bạn đang thực hiện một cái gì đó bên trong chúng. tức là biểu hiện

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