С 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
условие истинно, нет необходимости проверять ifNotExist
, потому что иногда метод exist() требует столько рабочей нагрузки для проверки), но у меня всегда есть проверить два раза. Как я могу избежать этого?
Возможно, слово "существует" заставляет кого-то неправильно понять мою идею. Вы можете себе представить, что мне также нужны некоторые методы:
ifVisible()
ifEmpty()
ifHasAttribute()
Многие говорили, что это плохая идея, но:
В Java 8 можно использовать лямбда Foreach вместо традиционной for
цикла. В программировании for
и if
есть два основных элемента управления потоком. Если мы можем использовать лямбда для for
цикла, почему используется лямбда для if
плохая идея?
for (Element element : list) {
element.doSomething();
}
list.forEach(Element::doSomething);
В Java 8 есть Optional
с ifPresent, аналогичная моей идее ifExist:
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);
Что лучше? И, oops, вы заметили, что в традиционном коде кода if
есть ошибка в:
if (e1.exist()) {
e0.actionC(); // Actually e1
}
Я думаю, что если мы используем лямбда, мы можем избежать этой ошибки!