2017-07-27 14 views
5

Trong đoạn mã dưới đây, tôi muốn hiển thị số lượt xem trống của mình nếu chuyến đi trống và sau đó quay lại và tránh chạy mã bên dưới, nhưng trình biên dịch cho biết "trả lại không được phép ở đây".Sử dụng trả lại bên trong một lambda?

mainRepo.fetchUpcomingTrips { trips -> 
    if (trips.isEmpty()) { 
     showEmptyViews() 
     return 
    } 

    // run some code if it's not empty 
} 

Có cách nào để quay lại như vậy không?

Tôi biết tôi chỉ có thể đặt nó trong một khối khác nếu tôi ghét viết nếu có, nó ít dễ hiểu hơn/có thể đọc được trong quan điểm của tôi khi có thêm một vài điều kiện.

Trả lời

14

Chỉ cần sử dụng cú pháp trả về đủ điều kiện: [email protected].

Trong Kotlin, return bên trong lambda có nghĩa là trở về từ làm tổ trong cùng fun (bỏ qua lambdas) và không được phép trong lambdas không phải là inlined.

Cú pháp [email protected] được sử dụng để chỉ định phạm vi trả về. Bạn có thể sử dụng tên của hàm lambda được chuyển đến (fetchUpcomingTrips) là nhãn:

mainRepo.fetchUpcomingTrips { trips -> 
    if (trips.isEmpty()) { 
     showEmptyViews() 
     [email protected] 
    } 

    // ... 
} 

liên quan:

3

Plain return gợi ý rằng bạn trở về từ hàm. Vì bạn không thể quay trở lại từ hàm bên trong một lambda, trình biên dịch sẽ phàn nàn. Thay vào đó, bạn muốn trả lại từ lambda và bạn phải sử dụng nhãn:

mainRepo.fetchUpcomingTrips { trips -> 
      if (trips.isEmpty()) { 
       showEmptyViews() 
       [email protected] 
      } 

      //run some code if it's not empty 
     } 
1

Lợi nhuận cho phép chúng tôi trở về từ một hàm ngoài. Trường hợp sử dụng quan trọng nhất là trả về từ biểu thức lambda

Câu lệnh trả về trong một hàm ẩn danh sẽ trở về từ chính hàm ẩn danh đó.

fun foo() { 
ints.forEach(fun(value: Int) { 
    if (value == 0) return // local return to the caller of the anonymous fun, i.e. the forEach loop 
    print(value) 
}) 
} 

Khi trả lại một giá trị, phân tích cú pháp cho phép ưu tiên cho sự trở lại đủ điều kiện, tức là

[email protected] 1 

nghĩa "return 1 tại nhãn @a" chứ không phải "trả lại một biểu hiện dán nhãn (@a 1) ". Trả lại Bằng cách trả về mặc định từ hàm kèm theo gần nhất hoặc chức năng ẩn danh.

Break Chấm dứt vòng lặp kèm theo gần nhất.

Tiếp tục Tiến hành bước tiếp theo của vòng bao quanh gần nhất.

Thông tin chi tiết tham khảo Returns and Jumps,Break and Continue Labels

0

Một thay thế cho các return có thể

mainRepo.fetchUpcomingTrips { trips -> 
      if (trips.isEmpty()) 
       showEmptyViews() 
      else { 
       //run some code if it's not empty 
      } 
     } 
Các vấn đề liên quan