2017-08-03 2 views
2

Zum Beispiel:Kann ich tatsächlich von Lambda zurückkehren, um von der Methode zurückzukommen und die Ausführung zu unterbrechen?

private String test(Optional myOptional) 
{ 
    myOptional.ifPresent(() -> return "1"); 
    return "0"; 
} 

so, wenn ich Test (myOptional) nenne es "1" zurückzukehren;

+0

würde der idiomatische Weg Optional API richtig levarage sein Sie können eine 'Funktion' zurückgeben. Passt das zu Ihrem Bedarf? Sie würden 'test() aufrufen. Apply()' –

+0

Nun, Sie haben den Code geschrieben, funktioniert es? Stell es einfach in eine Klasse und lass es laufen. – Nathan

+2

Mögliches Duplikat von [Return Lambda aus Methode in Java 8?] (Https://stackoverflow.com/questions/26771953/return-lambda-from-method-in-java-8) – litelite

Antwort

5

Sie können nicht aus dem Lambda-Körper "brechen" und einen Wert aus der umschließenden Methode zurückgeben. Die im Lambda verwendete return funktioniert nur im Rahmen des Lambda-Körpers.

private String test(Optional<Object> myOptional) { 
    return myOptional 
     .map(s -> "1") 
     .orElse("0"); 
} 

auch im Auge behalten, dass Optional s soll nicht als Argument Methode verwendet werden:

Why should Java 8's Optional not be used in arguments

+1

Gute Antwort. Besser als meins. Ich würde die Funktion auf Definition ändern: 'private String-Test (Optional myOptional)' – Michael

+0

@Michael schwer zu sagen, was war die Absicht des OP hier, aber sicherlich ist es eine der gültigen Optionen –

+0

Perfekte Antwort, danke! Aber es ist nicht möglich, die Ausführung der Methode zu unterbrechen, nur um die nächsten Methodenanweisungen zu umgehen, richtig? – user2620644

1

Das Problem, das Sie haben, ist, dass die return als die Rückkehr der Lambda-Funktion, nicht die Rückkehr der "Test" -Funktion genommen wird.

Optional.ifPresent erwartet keine Funktion, die einen Wert zurückgibt. Es erwartet eine Consumer<T>, die effektiv eine Funktion ist, die genau einen Parameter nimmt und nichts zurückgibt. Als normale Funktion, sondern als ein Lambda es in etwa so aussehen würde:

void myConsumer(String s) 
{ 
    System.out.println(s); 
} 

wollen Sie wahrscheinlich isPresent verwenden ('ist 'nicht' wenn'):

if (myOptional.isPresent()) 
{ 
    return "1"; 
} 
else 
{ 
    return "0"; 
} 

oder unter Verwendung eines ternären Operator:

return myOptional.isPresent() ? "1" : "0"; 

Nebenbei verwenden Sie den Rohtyp Optional. Dies wird zu einer Compiler-Warnung führen. Sie sollten erklären, welche Art der Optional durch Verwendung von Generika halten:

Optional<String> myOptional = /*something*/; 

Diese Sie Typ Compiler-Sicherheit geben, dass die Optional nicht andere Werte als Strings halten.

+0

Ich denke, er fragt über eine Rückkehr, die von der ganzen Methode bricht –

+0

@pivovarit Yep. Deine Antwort hat mich erkennen lassen. Ich werde meine Antwort leicht bearbeiten. – Michael

Verwandte Themen