Java 使用可选选项验证输入
我有一个CreateOrder实例,其中包含一些字符串、整数和双状态。当我在JUnit测试中为CreateOrder创建一个对象并将其发送过来时,我能够使用可选API验证字符串属性,但不能验证整数,如下所示-Java 使用可选选项验证输入,java,java-8,optional,Java,Java 8,Optional,我有一个CreateOrder实例,其中包含一些字符串、整数和双状态。当我在JUnit测试中为CreateOrder创建一个对象并将其发送过来时,我能够使用可选API验证字符串属性,但不能验证整数,如下所示- String aoid = Optional.ofNullable(createOrder.getAltorderid()).orElse(""); int quantity = Integer.parseInt(each.getQty()); double amount = Doubl
String aoid = Optional.ofNullable(createOrder.getAltorderid()).orElse("");
int quantity = Integer.parseInt(each.getQty());
double amount = Double.parseDouble(each.getPrice().getAmount());
和aoid一样,我也希望使用nullable()表示整数,但不知道如何使用它。我这样做的目的是使我的代码不受NullPointerExceptions
的影响,因此我想让用户对Integer
和Double
使用强大的选项。我对Java 8还相当陌生,并且对是否应该使用OptionalInt
或Optional
感到困惑?如果可选
,如何像使用字符串一样使用它
Integer.parseInt(each.getQty())
是足够安全的,因为如果each.getQty
为null
,您将得到一个NumberFormatException
,这应该是您尝试将字符串解析为整数并且不确定它时的行为
另一方面,对于null
的值,您仍然可以默认为0
,如下所示:
int quantity = Optional.ofNullable(each.getQty())
.map(Integer::parseInt)
.orElse(0);
类似于金额
double amount = Optional.ofNullable(each.getPrice().getAmount())
.map(Double::parseDouble)
.orElse(Double.NaN);
试试这个
Optional.ofNullable(each.getQty()).map(Integer::valueOf).orElse(0)
首先,我认为你误解了可选的目的
可选的要点是为返回值的函数提供一种方法,以指示不存在返回值。看见这允许调用方继续一系列fluent方法调用
、Java和OpenJDK开发人员
因此,为了正确使用可选API
,您需要重新思考您的代码。假设您的每个都有可为空的aoid
您的.getAltOrderId()
方法应如下实现:
Optional<String> getAltOrderId() {
return Optional.ofNullable(this.aoid);
}
请阅读以获得更详细的解释
假设您修改了.getQty()
方法以返回可选
,这应该可以满足您的需要:
int quantity = each.getQty()
.map(Integer::valueOf)
.orElse(0);
如果我的代码得到无效的输入,异常会在这里抛出吗?它不是优雅的.map(s->{try{return Integer.valueOf(s);}catch(exception e){return 0;}}}).
catch(exception e){return null;}
比catch更有意义(异常e){返回0;}
,因为您希望在这种情况下不存在可选项。如果输入无效,则生成NumberFormatException@AniruddhaTekade在这种情况下,您期望得到什么?理想情况下应该抛出它。如果发生异常,我想设置默认值。getter方法由其他人实现,代码由其他人引用Gradle作为依赖项。由于我无法更改这些方法,我希望确保如果收到无效输入,我的代码将设置默认值0/0.0/“”对于int/double/string类型。@AniruddhaTekade在这种情况下,请编辑该问题,因为该问题明确添加了使语句为空安全的要求,并且当前代码也不处理异常。此外,尽管在streams/optional API中处理异常是可能的,但我认为它非常混乱han提出了一种简单的迭代方法。
int quantity = each.getQty()
.map(Integer::valueOf)
.orElse(0);