2017-10-13 13 views

Répondre

1

Notez que Optional ne peut pas contenir de valeurs nulles, donc votre code exécutera le conditionnel ou échouera avec une exception à get(). Vous pouvez changer le get() en orElse(null); mais vous auriez toujours besoin du conditionnel séparé.

Au lieu de cela, utilisez Optional.map, puis orElse:

String name = 
    array.stream() 
     .min(myComparator) 
     .map(m -> m.getData().get("name")) 
     .orElse(someDefaultValue); 

Bien sûr, si vous ne voulez pas attribuer une valeur par défaut, vous pouvez omettre le orElse final et faire le type de variable Optional<String>.

1

Essayez ceci:

String name = array.stream().min(myComparator) // 
.map(item -> item.getData().get("Name")) // 
.orElse("No Name"); 
+0

Vous auriez besoin d'utiliser 'orElse (null)' au lieu de 'get()'; mais pourquoi déballer et re-emballer immédiatement l'option? –

+0

Mon mauvais, est allé avec le code OP et essayé de l'envelopper dans 'Optional ', corrigé maintenant –

0

Unfortunetly il n'y a pas moyen d'éviter soit une sorte de chèque ou une valeur par défaut (comme cela a été déjà écrit dans les réponses précédentes). Cela dit, il existe une bonne façon de faire des chèques avec des options. Laisse moi te donner un exemple. J'ai créé une classe simple pour les tests.

class ExampleData 
    { 
     private String name; 
     private int value; 

     public ExampleData(String name, int value) { 
      this.name = name; 
      this.value = value; 
     } 

     public String getName() { 
      return name; 
     } 

     public int getValue() { 
      return value; 
     } 

     @Override 
     public String toString() { 
      return "ExampleData{" + 
        "name='" + name + '\'' + 
        ", value=" + value + 
        '}'; 
     } 
    } 

Maintenant, écrivez une méthode de test simple.

public void testApp() 
    { 
     ArrayList<ExampleData> array = new ArrayList<>(Arrays.asList(
       new ExampleData("TestName", 1),new ExampleData("TestName1", 2))); 
     Optional<ExampleData> min = array 
       .stream() 
       .min(Comparator.comparingInt(ExampleData::getValue)); 

       min.ifPresent(System.out::println); 



    } 

Notez que je n'ai pas utilisé immédiatement get(). Au lieu de cela j'ai utilisé la méthode ifPresent quand je voulais extraire la valeur. Je ne sais pas si vous avez déjà utilisé le langage C# mais cette approche me rappelle l'opérateur ? de C#.

en C# vous suffit de faire quelque chose comme ça

String name = possibllyNullValue?.getName(); 

donc ici en Java que vous pouvez faire quelque chose de similaire avec ifPresent()

Bien sûr ifPresent retourne void il peut être gênant dans certains cas.