2016-04-19 6 views
2

Ich habe den folgenden Code blasen. Ich habe versucht, einen Weg zu finden, um die if (something.isPresent()) Zeile zu vermeiden und die Optional<Something> something auch zu deklarieren. Stattdessen möchte ich die Optional.orElse() Methode verketten und das Ergebnis direkt zurückgeben. Aber ich kann keinen Weg finden, da die Methode null zurückgeben muss, wenn das Element nicht gefunden wurde, und wenn es gefunden wurde, muss es eine Methode aufrufen, bevor es zurückkehrt.Wie verwendet man oderElse, wenn Sie eine Methode für das Ergebnis aufrufen müssen?

Gibt es einen besseren Weg, es zu tun?

import java.util.ArrayList; 
import java.util.List; 
import java.util.Optional; 

public class OrElseWhat { 

    private class Something { 
     private String it; 
     Something(String it) { this.it = it; } 
     String getIt() { return it; } 
    } 

    private List<Something> somethings = new ArrayList<Something>() { 
     { 
      add(new Something("one")); 
      add(new Something("two")); 
      add(new Something("three")); 
     } 
    }; 

    public String getFourOrNull() { 
     Optional<Something> something = somethings.stream() 
       .filter(s -> s.getIt().equals("four")) 
       .findAny(); 

     if (something.isPresent()) { 
      return something.get().getIt(); 
     } 

     return null; 
    } 
} 

Antwort

3

können Sie die Methode aufrufen, während Wert noch in Optional Form map verwendet, ist:

public String getFourOrNull() { 
    return somethings.stream() 
      .filter(s -> s.getIt().equals("four")) 
      .findAny() 
      .map(Something::getIt) 
      .orElse(null); 
} 

Von maps ‚s documentation:

Wenn ein Wert vorhanden ist, gelten die stellte ihm eine Zuordnungsfunktion zur Verfügung, und wenn das Ergebnis nicht Null ist, gebe ein Optional zurück und beschreibe das Ergebnis. Andernfalls geben Sie ein leeres Optional zurück.

Das heißt, wenn Sie @Aaron hören können, und legen Sie die orElse so dass getFourOrNull kehrt die Optional. Keine Methode sollte jemals null in einer Codebasis zurückgeben, wo Optional verwendet wird.

+0

Großartig! Ich dachte, die Karte würde eine NPE bekommen, aber ich denke, sie haben auch darüber nachgedacht :) – uzilan

2

Ich denke, Sie sollten lieber die Signatur Ihrer Methode zu Optional<String> ändern und immer something zurückgeben.

Optional für diese Art von Fall gemacht wurden: sie es ermöglichen, einige nicht-spezifischen Wert zu vermeiden Rückkehr (? Vielleicht ist es null oder "" oder -1) und ziemlich deutlich aus Ihrer Unterschrift describe beginnend vielleicht werden Sie sein kann einen Typ zurückgeben, aber nicht immer.

+0

Ich weiß. Leider kann ich in diesem Fall kein optionales zurückgeben. Wer es benutzt, benötigt die Null. – uzilan

Verwandte Themen