使用 Java lambda 而不是 'if else'

新手上路,请多包涵

使用 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 循环。在编程 forif 是两个基本的流控制。如果我们可以将 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 许可协议

阅读 543
1 个回答

因为它几乎但不真正匹配 Optional ,也许你可以重新考虑逻辑:

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);

Java 9:

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

通常这两个分支是不对称的。

原文由 Joop Eggen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题