当前位置: 首页 > 知识库问答 >
问题:

可选vs if/else-if性能Java 8

微生智刚
2023-03-14

你好,我有两个代码示例

if/else if/else语句

private Object getObj(message) {
        if (message.getA() != null)
            return message.getA();
        else if (message.getB() != null)
            return message.getB();
        else if (message.getC() != null)
            return message.getC();
        else return null;
}

可选语句

private Optional<Object> wrap(Object o){
    return Optional.ofNullable(o);
}

private Object getObj(message) {
    return  wrap(message.getA())
            .orElseGet(() -> wrap(message.getB())
            .orElseGet(() -> wrap(message.getC())
            .orElse(null)));
}

所以我的问题是这两者在性能方面是如何比较的(我在实际代码上有大约15-20个if-else语句)?

是否值得重构代码可读性与性能之间的关系,或者是对选项的误用?

另外,如果if/else-if语句增长到100+时,性能损失是什么?

提前致谢

共有2个答案

曾承弼
2023-03-14

还有第三种形式(允许一些变化)。

return Stream.<Supplier<Object>>of(message::getA, message::getB, message::getC)
        .map(Supplier::get)
        .filter(Objects::nonNull)
        .findFirst()
        .orElse(null);

可能是目前最不灵活和有效的,但很明显。

钮兴安
2023-03-14

不要将optionals用于条件逻辑。

它们被设计成从一个方法返回,以指示一个潜在的不存在的值。

仅仅因为你可以很好地将它们链接到一行中并不意味着这是可以理解的。而且你也一无所获。性能开销可能很大。在最坏的情况下,创建n对象,然后丢弃。只需使用“普通”if-else链即可。

与其想办法让您当前的代码更具可读性,不如退一步问问自己为什么需要15-20条if-else语句。你能把一些逻辑分解出来吗?为什么您需要一个getter用于这么多不同的字段和潜在的不同类型?等等。

 类似资料:
  • Perl条件语句有助于决策,这需要程序员指定一个或多个要由程序评估或测试的条件,以及在条件被确定为真时要执行的一个或多个语句,以及可选的其他条件如果确定条件为假,则执行语句。 以下是大多数编程语言中的典型决策结构的一般性 - 数字0,字符串'0'和“”,空列表()和undef在布尔上下文中都是false ,所有其他值都为true 。 否定真正的价值! 或not返回特殊的假值。 Perl编程语言提供

  • 本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执

  • if语句之后可以跟一个可选的else if...else语句,这对于使用单个if ... else if语句测试各种条件非常有用。 当使用if...else if…else语句时,请记住 - 一个if可以有零个或一个else语句,它必须在任何其他if之后。 如果语句可以有零到多个if,它们必须在else之前。 一旦else if成功,其余的if或else语句都不会被测试。 if ... else

  • 问题内容: 我想知道使用if语句或switch之间是否有效率差异。例如: 我认为,即使第一个if语句为true,程序也需要检查所有if语句。 但是在开关中,有一个break命令。我的对吗?如果没有,您能否解释一下两者之间的效率差异? 问题答案: 性能优于切换时的性能。一旦评估了开关,它就会知道需要执行哪种情况,但是在最坏的情况下必须经历所有情况。 列表条件越长,切换性能越好,但是对于较短的列表(仅

  • 问题内容: 我没有真正的运气可以通过使用Google来获得这种比较的简洁答案,我想先问一下,而不是自己进行耗时的评估。 我相当确定使用Enums的switch语句将比if-then-else语句执行得更快,尽管是否存在显着差异是另一个问题。 有人可以帮我一下吗? 感谢大家的快速反应,我会在以后的项目中牢记这一点。 问题答案: 是的,是的,因为一般而言,switch语句的运行速度比if / else

  • if语句后面可以跟一个else if...else语句,这对于使用单个if ... else if语句测试各种条件非常有用。 当使用if, else if, else语句时,要记住几点。 一个if可以有零个或一个else的,它必须在任何其他if之后。 一个if可以有零到多个else if是,他们必须在其他之前。 一旦else if成功, else if任何其他else if else不会被测试。