如何重构具有 if-else 语句的 java 代码



我想知道是否有任何好的技术可以使下面的代码更干净。

final Optional<Long> historyHours1;
final Optional<Double> historyHours2;
final Optional<Float> historyHours3;
if (parameters.isPresent()) {
historyHours1 = // some logic
historyHours2 = // some logic
historyHours3 = // some logic
} else {
historyHours1 = Optional.empty();
historyHours2 = Optional.empty();
historyHours3 = Optional.empty();
}

希望将变量保留为final,并使用一些技术来替换if-else。 考虑使用一种方法进行计算并返回包含 THERE 变量的对象,但将 THERE 变量组合到一个对象中,这是不期望的。

您可能不想将Optional用于三个最终变量。OptionalOptionalDoubleOptionalLong通常非常适合返回可能不存在的值。对于 20 行或更短方法中的局部变量,它们并不能真正买到任何东西。根据我的口味,final也是如此,但我承认这里的意见更加多样化。

我的建议是(鉴于您想要final变量):

final Long historyHours1 = parameters.map(p -> /* some logic */).orElse(null):
final Double historyHours2 = parameters.map(p -> /* some logic */).orElse(null):
final Float historyHours3 = parameters.map(p -> /* some logic */).orElse(null):

此重写的成本是,我们要测试三次您的参数是否存在。这可能没问题,但您需要自己权衡。

如果您坚持Optional,同样的想法有效:

final OptionalLong historyHours1 = parameters.stream()
.mapToLong(p -> /* some logic */)
.findAny();

其他变量类似。使用OptionalDoubleOptionalLongOptional<Float>因为没有OptionalFloat类。即使为了将装箱拆箱到OptionalLongOptionalDouble我们也需要通过代码行中所示的流。

根据您将使用historyHoursX变量的内容,也有可能涉及该重写,也可以利用parametersOptional进行重写(当我猜对时)。因此,您可能希望向我们展示更多您现有的代码。

使用 switch 可能会有所帮助,因为您可能会添加更多 else 条件。

最新更新