2017-06-29 2 views
1

Pouvez-vous s'il vous plaît donner un exemple comment transformer cela en utilisant Java 8 facultatif.Transformer la vérification null en Java 8 Facultatif

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

Jusqu'à présent, je fais

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

Mon humble avis est que 'Optional.ofNullable (foo) .isPresent()' est pire que 'foo! = Null' et' orElse (null) 'est simplement en train de rompre le but d'un' Optional'. J'espère que vous venez de présenter votre question comme ça pour plus de simplicité et que ce n'est pas du vrai code, parce que vous pouvez clairement voir que la deuxième option est plus verbeuse et inutilement complexe que la première. –

+0

Je ne vois pas d'avantage sur une vérification nulle de vanille. Quelqu'un peut-il expliquer les avantages et les cas d'utilisation pour optionnel? – TimSchwalbe

+3

Je vois des avantages à utiliser 'Optional 'comme paramètre de retour. Vous déclarez dans vos interfaces/api que vous renvoyez 'Optional ' plutôt que 'Object' pour informer poliment les développeurs suivants qui s'interfacent avec cette API qu'ils doivent faire une vérification nulle. Les options sont également plus soignées pour les méthodes chaînées. Mais OMI, il ne devrait y avoir aucune raison de jamais déclarer un «optionnel» local. –

Répondre

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

ou au lieu de 'orElse (null)' définir la valeur directement avec ' ifPresent (motion :: setLocation) ' – ledniov