使用 Java 8,我有以下代码:
if(element.exist()){
// Do something
}
我想转换为 lambda 样式,
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 中,我们可以使用 lambda forEach 代替传统的 for
循环。在编程 for
和 if
是两个基本的流控制。如果我们可以将 lambda 用于 for
循环,为什么将 lambda 用于 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);
哪个更好?而且,哎呀,您是否注意到在传统的 if
子句代码中,有一个错误:
if (e1.exist()) {
e0.actionC(); // Actually e1
}
我认为如果我们使用 lambda,我们可以避免这个错误!
原文由 yelliver 发布,翻译遵循 CC BY-SA 4.0 许可协议
因为它几乎但不真正匹配 Optional ,也许你可以重新考虑逻辑:
Java 8 的表达能力有限:
这里
map
可能会限制元素的视图:Java 9:
通常这两个分支是不对称的。