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";
}
私の期待は、first()が空ではないことを返します。オプションで、その2番目は評価されません。しかし、実際に出力されている:
テストでorElseで使用される機能を試す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
なぜ評価され2番目のオプションはありますか?これは悪いようですか?
を期待する
orElseGet
を使用することができ、サプライヤーを提供したり、熱心に実行を避けるために必要がある場合。おそらく 'orElseGet(...)'が必要になるでしょう。あなたのコード内の任意のラムダ式を持っていないとき – khelwoodはなぜあなたの質問には、「ラムダ」でタグ付けされましたか? –
は常にグーグルは、ラムダを与えるのでとorElseGetは、主に、ラムダ構築物で使用されています。 –