我想有機會,使流內部空檢查:Java流API:可選,如果不爲空繼續
firstItem = array.stream().min(myComparator).get();
if(firstItem!=null){
name = firstItem.getData().get("Name")
}
是否有可能從流中獲取name
吧?
我想有機會,使流內部空檢查:Java流API:可選,如果不爲空繼續
firstItem = array.stream().min(myComparator).get();
if(firstItem!=null){
name = firstItem.getData().get("Name")
}
是否有可能從流中獲取name
吧?
請注意,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>
。
試試這個:
String name = array.stream().min(myComparator) //
.map(item -> item.getData().get("Name")) //
.orElse("No Name");
偏偏就沒有辦法來避免或者某種檢查或默認值(如已張貼在以前的答案)。說了這麼多,有一個很好的方式來使用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類似的東西,所以它可以在某些情況下,不方便。
您需要使用'orElse(null)'而不是'get()';但爲什麼打開並立即重新包裝可選? –
我的不好,與OP代碼一起去,試圖用'Optional'包裝它,現在糾正 –