2017-07-27 4 views
5

Im folgenden Code möchte ich meine leeren Ansichten zeigen, wenn Trips leer ist und dann zurückkehren und vermeiden, den folgenden Code auszuführen, aber der Compiler sagt "Rückkehr ist hier nicht erlaubt".Verwendung von Return in einem Lambda?

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

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

Gibt es eine Möglichkeit wie das zurück?

Ich weiß, ich kann es einfach in einen if else Block stellen, aber ich hasse es zu schreiben, wenn es anders ist, es ist weniger verständlich/lesbar meiner Meinung nach, wenn es ein paar mehr Bedingungen gibt.

Antwort

14

Verwenden Sie einfach die qualifizierte Rückgabesyntax: [email protected].

In Kotlin, return innerhalb eines Lambdas bedeutet Rückkehr von dem innersten Verschachtelung fun (ohne Berücksichtigung Lambda), und es ist nicht in Lambda erlaubt, die nicht inlined sind.

Die [email protected]-Syntax wird verwendet, um den zurückzugebenden Bereich anzugeben. Sie können den Namen der Funktion der Lambda (fetchUpcomingTrips) als Label übergeben wird:

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

    // ... 
} 

Verwandte:

3

Ebene return schlägt vor, dass Sie von der Funktion zurückkehren. Da Sie von der Funktion in einem Lambda nicht zurückkehren können, wird der Compiler beschweren. Stattdessen möchten Sie aus dem Lambda zurück, und Sie haben ein Label zu verwenden:

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

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

Die Renditen ermöglichen es uns, von einer äußeren Funktion zurückzukehren. Der wichtigste Anwendungsfall ist die Rückgabe eines Lambda-Ausdrucks

Eine Rückgabeanweisung in einer anonymen Funktion wird von der anonymen Funktion selbst zurückgegeben.

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) 
}) 
} 

Wenn ein Wert zurückgegeben wird, gibt der Parser bevorzugt die qualifizierte Gegenzug dh

[email protected] 1 

bedeutet "return 1 an Kennung @a" und nicht „zurück einen markierten Ausdruck (@a 1) ". Rückgabe Standardmäßig wird von der nächsten umschließenden Funktion oder anonymen Funktion zurückgegeben.

Bruch Beendet die nächste umschließende Schleife.

Weiter Geht zum nächsten Schritt der nächsten umschließenden Schleife.

Weitere Informationen finden Returns and Jumps,Break and Continue Labels

0

Eine Alternative zur return könnte sein

mainRepo.fetchUpcomingTrips { trips -> 
      if (trips.isEmpty()) 
       showEmptyViews() 
      else { 
       //run some code if it's not empty 
      } 
     } 
Verwandte Themen