2017-10-13 44 views

回答

1

請注意,Optional不能包含空值,因此您的代碼將執行條件或者在get()處發生異常並失敗。

您可以將get()更改爲orElse(null);但你仍然需要單獨的條件。

相反,使用Optional.map,然後orElse

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

當然,如果你不想指定一個默認值,可以省略最後orElse,使變量類型Optional<String>

1

試試這個:

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

您需要使用'orElse(null)'而不是'get()';但爲什麼打開並立即重新包裝可選? –

+0

我的不好,與OP代碼一起去,試圖用'Optional'包裝它,現在糾正 –

0

偏偏就沒有辦法來避免或者某種檢查或默認值(如已張貼在以前的答案)。說了這麼多,有一個很好的方式來使用optionals進行檢查。讓我舉一個例子。 我爲測試創建了簡單的類。

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 + 
        '}'; 
     } 
    } 

現在讓我們寫一個簡單的測試方法。

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



    } 

請注意,我沒有立即使用get()。相反,當我想要提取價值時,我使用了ifPresent方法。我不知道你是否曾經使用過C#語言,但是這種方法讓我想起了c#中的?運算符。

在C#中,你只會做這樣的事

String name = possibllyNullValue?.getName(); 

所以這裏在Java中,你可以做當然ifPresent()

ifPresent返回void類似的東西,所以它可以在某些情況下,不方便。