【问题标题】:java: Optimizing if statement in Java using Optional [closed]java:使用 Optional 优化 Java 中的 if 语句 [关闭]
【发布时间】:2020-09-25 00:16:44
【问题描述】:

我在 Java 中有以下代码,需要使用 Java 8 中的 Optional 进行优化:

if (x.isEmpty() || x.contains("<")) {
   x = "hello1";
}
else if (x.contains(",")) {
   x = "hello2";
} else {
   x = "hello3";
}

有人可以建议使用 Optional 的基于 Java 8 的代码吗?

我不想使用多个 if-else。我更喜欢在 java 8 中使用像 Optional 这样更实用的东西,因为 if-else 是更命令式的风格。所以我可以纠正说我的目标不是在性能方面的代码优化,而是让它使用本质上更实用的 Java 8 标准。

【问题讨论】:

  • 代码对我来说看起来非常易读和高性能。您希望在“优化”方面得到什么?
  • 我不想使用多个 if-else 并使用功能更强大的东西,例如 java 8 中的 Optional,因为 if-else 是更命令式的风格。所以,我可以纠正并说我的目标不是在性能方面的代码优化,而是让它使用本质上更实用的 java 8 标准
  • 代码是完美的。 Optional 并不是要替换 if/else 块,而是用作可能返回结果或不返回结果的方法的返回值。根据需要使用Optional 被视为反模式。至少,Stuart Marks 是 Optional youtu.be/Ej0sss6cq14?t=1665 背后的首席开发人员
  • 并且将方法调用添加到没有它们已经可以工作的代码不可能被描述为optimization。不清楚你在问什么。

标签: java java-8


【解决方案1】:
    x = x.isEmpty() || x.contains("<") ? "hello1" 
            : x.contains(",") ? "hello2" : "hello3";

如果您追求在某些情况下可以使用Optional 的函数式风格,那么在这种情况下您仍然不需要Optional,而是需要良好的旧条件运算符(有时称为三元运算符;它从 Java 1.0 开始就存在)。没有任何有意义的方法可以将 Optional 放入您的代码中。

【讨论】:

  • 它甚至可以放在一行中
【解决方案2】:

我已经尝试过这种方法。它使您的代码更加简洁和面向对象。当存在大量导致混乱的 if/else 块时,可以使用此模式。希望这是您正在寻找的。​​p>

package com.test;

import java.util.Optional;

public class Refactor {

String x;

public Refactor(String x) {
this.x = x;
}

Optional<String> condition1() {
    if (x.isEmpty() || x.contains("<")) {
           return Optional.of("hello1");
        }
    return Optional.ofNullable(null);
}

Optional<String> condition2() {
    if (x.contains(",")) {
           return Optional.of("hello2");
        }
    return Optional.ofNullable(null);
}

public String  conditionTest() {
    Refactor refactor = new Refactor("ab<cd");
    if(refactor.condition1().isPresent()) {
        return refactor.condition1().get();
    }
    if(refactor.condition2().isPresent()) {
        return refactor.condition2().get();
    }
    return "hello3";
}

}

【讨论】:

  • 除了需要十倍的代码之外,这个答案甚至没有显示,如何避免main方法中的两个if语句。连续两次评估condition1condition2,然后调用isPresent,然后调用get,这不是应该使用Optional 的方式。使用orElseGet​orElse 来解决实际问题。除此之外,使用带有字符串数组参数的main 方法,但不是static 和非void 返回类型,会让读者感到困惑,没有任何好处。
  • 该问题要求摆脱两个if 语句。你有四个。
  • 这个答案需要讨论,但肯定否决票是不公平的。 @Ol 接受的答案
  • 我的答案需要讨论,但肯定否决票是不公平的。也许我没有表达我的意图。 @OleV.V 接受的答案。使用车削运算符,当条件检查的数量增加时,它变得非常破旧。我的代码的优点是 if/else 对被转换为 if 块。阅读 10 if 块比 10 if/else 块更清晰、更易于理解。仅由于可选类和封装设计原则,它才成为可能。初始代码中的方法参数是不必要的,我已经对其进行了重构。
  • 我没有投反对票,也不会投反对票。关于答案是否有用的意见不同,认为没有用的用户可能会通过投票来帮助其他持有相同意见的用户。不公平和莫名其妙的反对票也是 Stack Overflow 生活的一部分。他们总是在我最意想不到的时候打我,但从大局来看,他们并没有受到伤害。看看您是否可以将其视为差异的有趣标志,而不是对您造成的伤害。
猜你喜欢
  • 2023-03-28
  • 2016-11-29
  • 2020-02-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多