Java 使用可选选项验证输入

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

我有一个CreateOrder实例,其中包含一些字符串、整数和双状态。当我在JUnit测试中为CreateOrder创建一个对象并将其发送过来时,我能够使用可选API验证字符串属性,但不能验证整数,如下所示-

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);