使用可选验证输入

时间:2019-01-10 08:19:32

标签: java java-8 optional

我有一个CreateOrder实例,其中包含一些String,Integer和Double状态。当我在JUnit测试中为CreateOrder创建对象并将其发送时,我可以使用Optional API验证String属性,但不能验证Integer,如下所示-

String aoid = Optional.ofNullable(createOrder.getAltorderid()).orElse("");

int quantity = Integer.parseInt(each.getQty());
double amount = Double.parseDouble(each.getPrice().getAmount());

就像aoid一样,我也想使用ofNullable()作为整数,但无法弄清楚如何。我这样做的目的是为了使我的代码不受NullPointerExceptions的影响,因此我想让功能强大的Optional的用户使用IntegerDouble。我对Java 8相当陌生,如果应该使用OptionalIntOptional<Integer>会感到困惑吗?如果是Optional<Integer>,如何像我在String中使用的那样使用它?

3 个答案:

答案 0 :(得分:2)

d_issue     ch_no
2018-11-05  10670638

足够安全,因为如果Integer.parseInt(each.getQty()) each.getQty,您最终将得到一个null,这是您尝试将String解析为Integer时的行为。不确定。

另一方面,您可以将NumberFormatException的值默认设置为0

null

类似地int quantity = Optional.ofNullable(each.getQty()) .map(Integer::parseInt) .orElse(0);

amount

答案 1 :(得分:1)

尝试

Optional.ofNullable(each.getQty()).map(Integer::valueOf).orElse(0)

答案 2 :(得分:0)

首先,我认为您误解了Optional的目的。

  

可选的要点是为函数提供一种返回值的手段,以指示缺少返回值。参见this discussion。这样,调用方就可以继续进行一系列流畅的方法调用。

     

Stuart Marks,Java和OpenJDK开发人员

因此,为了正确使用Optional API,您需要重新考虑代码。假设您的each具有可为空的aoid,则您的.getAltOrderId()方法应这样实现:

Optional<String> getAltOrderId() {
    return Optional.ofNullable(this.aoid);
}  

然后您可以按以下方式使用它:

String aoid = createOrder.getAltOrderId().orElse("");

请阅读this post以获得更详细的说明。

假设您修改了.getQty()方法以返回Optional<String>,这应该可以满足您的要求:

int quantity = each.getQty()
                   .map(Integer::valueOf)
                   .orElse(0);