2017-06-29 3 views
1

Können Sie uns ein Beispiel geben, wie Sie dies mit Java 8 Optional umwandeln können?Null-Überprüfung in Java konvertieren 8 Optional

  Motion motion = new Motion(); 

      if (null!= site.getLocation() && null != site.getLocation().getLatitude() && null != site.getLocation().getLongitude()) { 
       Point p = GeoJson.point(site.getLocation().getLatitude(), site.getLocation().getLongitude()); 
       motion.setLocation(p); 
      } 

Bis jetzt mache ich das

Motion motion = new Motion(); 
    Optional<Location> locationOptional = Optional.ofNullable(site.getLocation()); 
    Point p = locationOptional 
      .map(location -> { 
        if (Optional.ofNullable(location.getLatitude()).isPresent() && Optional.ofNullable(location.getLongitude()).isPresent()) { 
         return GeoJson.point(location.getLatitude(), location.getLongitude()); 
        } 
        return null; 
       }) 
     .orElse(null); 
    motion.setLocation(p); 
+5

Meine bescheidene Meinung ist, dass 'Optional.ofNullable (foo) .isPresent()' ist schlimmer als 'foo! = Null' und' orElse (null) 'bricht einfach den Zweck eines' Optional'. Ich hoffe, du hast deine Frage einfach so dargestellt, weil es einfach ist und kein wirklicher Code ist, weil du deutlich sehen kannst, dass die zweite Option ausführlicher und unnütz komplexer ist als die erste. –

+0

Ich sehe keinen Vorteil gegenüber einem Vanille-Null-Check. Kann jemand die Vorteile und Anwendungsfälle für Optional erklären? – TimSchwalbe

+3

Ich sehe Vorteile bei der Verwendung von 'Optional' als Rückgabeparameter. Sie geben in Ihren Schnittstellen/api an, dass Sie 'Optional ' anstelle von 'Object' zurückgeben, um die folgenden Entwickler höflich darüber zu informieren, dass sie mit der API kommunizieren, die sie für eine Nullprüfung benötigen. 'Optional sind' s auch im Umgang mit verketteten Methoden. Aber IMO, es sollte keinen Grund geben, jemals ein lokales "Optional" zu deklarieren. –

Antwort

8
GeoJson geoJson = 
    Optional.ofNullable(s.getLocation()) 
      .filter(l -> l.getLatitude() != null) 
      .filter(l -> l.getLongitude() != null) 
      .map(l -> GeoJson.point(l.getLatitude(), l.getLongitude())) 
      .orElse(null); 
+1

oder anstelle von 'orElse (null)' den Wert direkt mit 'sehen ifPresent (motion :: setLocation) ' – ledniov

Verwandte Themen