Java 使用可选选项简化许多if检查

Java 使用可选选项简化许多if检查,java,if-statement,optional,Java,If Statement,Optional,我可以用可选的或其他Java 8特性来简化这个过程吗?如果您真的想在这里寻找一个包含可选的实现,我在评论中建议的方法可以实现为返回一个 if (reg[0] != null && reg[0].trim().length() > 0) { orderData.setCity(reg[0]); } if (reg[1] != null && reg[1].trim().length() > 0) { orderData.setCountry(

我可以用可选的或其他Java 8特性来简化这个过程吗?

如果您真的想在这里寻找一个包含可选的实现,我在评论中建议的方法可以实现为返回一个

if (reg[0] != null && reg[0].trim().length() > 0) {
   orderData.setCity(reg[0]);
}
if (reg[1] != null && reg[1].trim().length() > 0) {
   orderData.setCountry(reg[1]);
}
if (reg[2] != null && reg[2].trim().length() > 0) {
   orderData.setObjectType(reg[2]);
}
if (reg[3] != null && reg[3].trim().length() > 0) {
   orderData.setChannel(reg[3]);
}

如果您真的想在这里寻找一个包含Optional的实现,那么可以实现我在评论中建议的方法来返回一个

if (reg[0] != null && reg[0].trim().length() > 0) {
   orderData.setCity(reg[0]);
}
if (reg[1] != null && reg[1].trim().length() > 0) {
   orderData.setCountry(reg[1]);
}
if (reg[2] != null && reg[2].trim().length() > 0) {
   orderData.setObjectType(reg[2]);
}
if (reg[3] != null && reg[3].trim().length() > 0) {
   orderData.setChannel(reg[3]);
}
这里的可选工具可能是错误的

取而代之的是杠杆作用

您仍然必须写出每个值,因为它们映射到不同的字段,但这将清除这些值,并允许您使用更传统的方法检查空白字符串。

可选工具在这里可能是错误的

取而代之的是杠杆作用


您仍然必须写出每个值,因为它们映射到不同的字段,但这将清除这些值,并允许您使用更传统的方法检查空白字符串。

可选选项在这里可能对您没有帮助

首先要考虑的是哨兵价值观。这里您清楚地表明,您认为,从语义上讲,reg[0]为null相当于reg[0]为空字符串,甚至是一个只包含空格的字符串。这应该是非同寻常的。null不是“nothing”或“empty”的代名词。null应该是“没有值”的代名词。最好的方法是找到生成reg[0]的位置,并确保此处设置了空字符串的正确语义。那么这个代码可以是:if!reg[0].isEmpty orderData.setCityreg[0];-这么干净

当然,这并不总是可能的。例如,如果reg是从一个库或其他不受您控制的代码中导出的,或者它是一个由JSON demarshaller创建的对象

在这种情况下,我通常建议创建一个显式步骤来转换一个“不干净”的对象,即使在语义上应该是空字符串的情况下,它也有空值

如果这是不可行或不可能的,那么,处理一个“不干净”的对象永远不会是特别漂亮的,风格方面的。助手方法会有很大帮助,如下所示:

if (StringUtils.isNotBlank(reg[0])) {
   orderData.setCity(reg[0]);
}

“可选”在这里可能帮不了你

首先要考虑的是哨兵价值观。这里您清楚地表明,您认为,从语义上讲,reg[0]为null相当于reg[0]为空字符串,甚至是一个只包含空格的字符串。这应该是非同寻常的。null不是“nothing”或“empty”的代名词。null应该是“没有值”的代名词。最好的方法是找到生成reg[0]的位置,并确保此处设置了空字符串的正确语义。那么这个代码可以是:if!reg[0].isEmpty orderData.setCityreg[0];-这么干净

当然,这并不总是可能的。例如,如果reg是从一个库或其他不受您控制的代码中导出的,或者它是一个由JSON demarshaller创建的对象

在这种情况下,我通常建议创建一个显式步骤来转换一个“不干净”的对象,即使在语义上应该是空字符串的情况下,它也有空值

如果这是不可行或不可能的,那么,处理一个“不干净”的对象永远不会是特别漂亮的,风格方面的。助手方法会有很大帮助,如下所示:

if (StringUtils.isNotBlank(reg[0])) {
   orderData.setCity(reg[0]);
}

创建一个接受字符串并进行检查的方法,这将大大提高可读性。可选。ofNullablereg[0]。filterr->r.trim.length>0。ifPresentorderData::setCity;-虽然我不会说它更干净。看起来像是reg数组的重复。reg数组的元素都是字符串类型吗?是的,reg数组包含所有字符串类型创建一个接受字符串的方法并为您进行检查,这将大大提高可读性。可选。ofNullablereg[0].filterr->r.trim.length>0.ifPresentorderData::setCity;-虽然我不会说它更干净。看起来像是reg数组的副本。reg数组的元素都是字符串类型吗?是的,reg数组包含所有字符串类型:int:city->orderData.setCitycity可以缩短为orderData::setCityHint:city->orderData.setCitycity可以缩短为orderData::setCityNaman的答案是一个很好的例子,说明了可选可以如何提高可读性:validInputreg[0]。ifPresentorderData::setCity。然而,您的答案更好地指出了他面临的实际问题:他没有将验证抽象为可重用的形式。专注于可选是XY,但我不会说这对于他的情况是一个错误的工具,它只是不需要解决他的问题,并且有点分散了他对实际问题的注意力。您的回答清楚地表明,可选性不是解决此问题的必要条件。Naman的回答是可选性如何提高可读性的一个很好的例子:validInputreg[0]。ifPresentorderData::setCity。然而,你的答案更好
他指出了他面临的实际问题:他没有将验证抽象为可重用的形式。专注于可选是XY,但我不会说这对于他的情况是一个错误的工具,它只是不需要解决他的问题,并且有点分散了他对实际问题的注意力。您的回答清楚地表明,可选不是解决此问题的必要条件。这会改变语义。OP的代码处理未修剪的数据;修剪只是为了验证。您的代码处理修剪过的数据。虽然这可能不重要,但要记住。为了保持语义不变,引入一个新的局部变量来引用修剪后的值,并对其进行验证,而不是重新分配参数变量。这会改变语义。OP的代码处理未修剪的数据;修剪只是为了验证。您的代码处理修剪过的数据。虽然这可能不重要,但要记住。为了保持语义不变,请引入一个新的局部变量来引用修剪后的值,并在此基础上进行验证,而不是重新分配参数变量。
normalizeThenSetIfNonBlank(reg[0], orderData::setCity);
normalizeThenSetIfNonBlank(reg[1], orderData::setCountry);

private void normalizeThenSetIfNonBlank(String in, Consumer<String> target) {
    if (in == null) return;
    in = in.trim();
    if (in.isEmpty()) return;
    target.accept(in);
}
Optional.ofNullable(reg[0]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setCity);
Optional.ofNullable(reg[1]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setCountry);
Optional.ofNullable(reg[2]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setObjectType);
Optional.ofNullable(reg[3]).filter(val -> val.trim().length() > 0).ifPresent(orderData::setChannel);