我想知道是否有任何好的技术可以使下面的代码更干净。
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
用于三个最终变量。Optional
、OptionalDouble
和OptionalLong
通常非常适合返回可能不存在的值。对于 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();
其他变量类似。使用OptionalDouble
和OptionalLong
。Optional<Float>
因为没有OptionalFloat
类。即使为了将装箱拆箱到OptionalLong
或OptionalDouble
我们也需要通过代码行中所示的流。
根据您将使用historyHoursX
变量的内容,也有可能涉及该重写,也可以利用parameters
Optional
进行重写(当我猜对时)。因此,您可能希望向我们展示更多您现有的代码。
使用 switch 可能会有所帮助,因为您可能会添加更多 else 条件。