「if else」の代わりにJavaラムダを使用する 質問する

「if else」の代わりにJavaラムダを使用する 質問する

Java 8 では、次のコードがあります:

if(element.exist()){
    // Do something
}

ラムダスタイルに変換したいのですが、

element.ifExist(el -> {
    // Do something
});

次のような方法でifExist:

public void ifExist(Consumer<Element> consumer) {
    if (exist()) {
        consumer.accept(this);
    }
}

しかし、今は他のケースを呼び出す必要があります:

element.ifExist(el -> {
    // Do something
}).ifNotExist(el -> {
    // Do something
});

同様の を記述できますifNotExistが、これらが相互に排他的であることを望みます (条件existが true の場合、 をチェックする必要はありませんifNotExist。exist() メソッドのチェックに非常に多くの作業負荷がかかることがあるためです)。しかし、常に 2 回チェックする必要があります。どうすればこれを回避できますか?

おそらく、「存在する」という言葉は、私の考えを誤解させるかもしれません。いくつかの方法も必要だと想像できます。

ifVisible()
ifEmpty()
ifHasAttribute()

これは悪い考えだと多くの人が言いましたが、

Java 8 では、従来のループの代わりに lambda forEach を使用できますfor。プログラミングではfor、 とifは 2 つの基本的なフロー制御です。ループに lambda を使用できる場合for、なぜ lambda を使用するのは悪い考えなのでしょうかif?

for (Element element : list) {
    element.doSomething();
}

list.forEach(Element::doSomething);

Java 8 には、OptionalifExist の私のアイデアに似た ifPresent があります。

Optional<Elem> element = ...
element.ifPresent(el -> System.out.println("Present " + el);

ifコードのメンテナンスと可読性についてですが、次のような単純な句が多数繰り返されるコードがあったらどう思いますか?

if (e0.exist()) {
    e0.actionA();
} else {
    e0.actionB();
}

if (e1.exist()) {
    e0.actionC();
}

if (e2.exist()) {
    e2.actionD();
}

if (e3.exist()) {
    e3.actionB();
}

比較対象:

e0.ifExist(Element::actionA).ifNotExist(Element::actionB);
e1.ifExist(Element::actionC);
e2.ifExist(Element::actionD);
e3.ifExist(Element::actionB);

どちらが良いでしょうか? ところで、従来のif条項コードでは、次の部分に間違いがあることに気づきましたか:

if (e1.exist()) {
    e0.actionC(); // Actually e1
}

ラムダを使用すれば、この間違いを回避できると思います。

ベストアンサー1

ほぼ一致しているが、完全に一致しているわけではないオプションおそらく、あなたはその論理を再考するかもしれません:

Java 8 の表現力には限界があります。

Optional<Elem> element = ...
element.ifPresent(el -> System.out.println("Present " + el);
System.out.println(element.orElse(DEFAULT_ELEM));

ここで、map要素のビューが制限される可能性があります。

element.map(el -> el.mySpecialView()).ifPresent(System.out::println);

Java9:

element.ifPresentOrElse(el -> System.out.println("Present " + el,
                        () -> System.out.println("Not present"));

一般的に、2 つのブランチは非対称です。

おすすめ記事