我在評估Java選項時遇到了一些麻煩。請看下面的測試:Java可選評估副作用
@Test
public void test() {
System.out.println("GOT STRING: " + first().orElse(second()));
}
private Optional<String> first() {
System.out.println("Evaluating first");
return Optional.of("STRING OPTIONAL");
}
private String second() {
System.out.println("Evaluating second");
return "SECOND STRING";
}
我的期望是,由於第()返回一個非空可選,即二是不進行評估。但事實上,輸出是:
Evaluating first
Evaluating second
GOT STRING: STRING OPTIONAL
試圖在測試中使用否則容易的功能:
@Test
public void test2() {
System.out.println("GOT STRING: " + (first() != null ? "FIRST IS NOT NULL" : second()));
}
輸出:
Evaluating first
GOT STRING: FIRST IS NOT NULL
爲什麼第二個選項評估?這似乎很糟糕?
如果調用'否則容易(...)'然後說法肯定會進行評估。也許你想'orElseGet(...)'接受一個它需要時調用的函數。 – khelwood
當你的代碼中沒有任何lambda表達式時,爲什麼你的問題用「lambda」標記? –
由於googling總是給lamdas,而orElseGet通常與lamda構造一起使用。 –