在Groovy或Java中是否有任何类型的安全导航操作符用于算术运算?

时间:2011-10-21 06:23:18

标签: java grails groovy

以下代码行位于我的一个if语句中:

$("#dateOfTransaction_month").val() != "${loadInstance?.payment?.dateOfTransaction?.getAt(Calendar.MONTH) + 1}"

由于Java的日期/时间管理如此混乱,我必须编写+ 1才能获得正确的月份。问题是有时候payment对象可能不存在,所以我基本上会说null + 1。这给了我错误Cannot invoke method plus() on null object。有没有任何简洁的方法(整洁的像Groovy的safe navigation operator)我可以解释payment语句中if对象为空的可能性,或者我被迫检查看看如果if语句之前的值为空?

4 个答案:

答案 0 :(得分:7)

Groovy向Date添加了一个plus()方法,这是+运算符调用的方法。您可以自己直接调用它并将安全导航操作符链接到它。

$("#dateOfTransaction_month").val() != "${loadInstance?.payment?.dateOfTransaction?.getAt(Calendar.MONTH)?.plus(1)}"

http://groovy.codehaus.org/groovy-jdk/java/util/Date.html#plus(int

答案 1 :(得分:1)

在同一页面上,您实际上就是Elvis运算符(某些可能是空值?:默认值)。 使用Elvis,您可以指定要使用的默认值。

e.g。

$("#dateOfTransaction_month").val() != "${(loadInstance?.payment?.dateOfTransaction?.getAt(Calendar.MONTH) ?: 0) + 1}"

然后默认为1月

答案 2 :(得分:0)

要解决使用恼人的Java Date和Calendar API的问题,您可以查看JodaTime。与内置API相比,这是一个梦想。

答案 3 :(得分:-1)

当我玩它的时候,这是我非常喜欢Groovy的一件事,?自动测试空引用的运算符。

在Java中没有这样的东西,你只需测试你正在遍历的任何对象层次结构来检查空值:

if (object1 != null && obecjt1.obecjt2 != null && object1.object2.object3 != null)
    do_something_awesome_with(object1.object2.object3);

然而,你的例子总是会引起麻烦,因为Groovy的?运算符只是在遇到空引用时停止遍历并返回null。