我有一个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
的用户使用Integer
和Double
。我对Java 8相当陌生,如果应该使用OptionalInt
或Optional<Integer>
会感到困惑吗?如果是Optional<Integer>
,如何像我在String中使用的那样使用它?
答案 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);