Java 如何计算列中的结果列表编号?

Java 如何计算列中的结果列表编号?,java,freemarker,Java,Freemarker,我正在使用SpreadsheetMapper工具,我想计算列中列出的数字的结果 当我使用结果列表时,此代码不起作用 <#function TW nums...> <#local sum = 0> <#list nums as num> <#local sum += num> </#list> <#if nums?size != 0> <#return sum > </#i

我正在使用SpreadsheetMapper工具,我想计算列中列出的数字的结果

当我使用结果列表时,此代码不起作用

<#function TW nums...>
  <#local sum = 0>
  <#list nums as num>
    <#local sum += num>
  </#list>
  <#if nums?size != 0>
    <#return sum >
  </#if>
</#function>
${TW(result['TotalWeightListResult']!)}

${TW(结果['TotalWeightListResult']!)}

当我使用静态列出的数字时,它会起作用

<#function TW nums...>
  <#local sum = 0>
  <#list nums as num>
    <#local sum += num>
  </#list>
  <#if nums?size != 0>
    <#return sum >
  </#if>
</#function>
${TW(10 20)}

${TW(1020)}
参考-


这是我想到的第一件事-

如果您使用
nums…
参数声明
TW
,并将列表传递给
TW
,它将只是
nums
中的第一个元素。这是因为参数在FreeMarker中没有声明的类型,所以不清楚您的意思

在你的例子中还有一个令人困惑的巧合。如果您正在发送
缺少的内容
TW
,则
nums
的第一个元素将是空字符串,这是
表达式的结果操作。因为
+
被重载,既可以用作加法,也可以用作字符串连接,
sum+=num
将不会失败,而是执行字符串连接。因此,它首先将
sum
转换为字符串
“0”
,然后将空字符串附加到该字符串中。因此,返回值
“0”
,这是一个字符串,在打印时,它看起来就像数字
0
。但它实际上不是一个
0
数字


所以,只要使用
,它就会按预期工作。如果您想传递一个文本列表,那么可以编写
TW([10,20])
。但我想通常情况下,您不想将预定义列表传递给
TW
,因此额外的
[]
并不是什么大问题。

感谢您的解释,是的,我这样做是错误的,因为我只将0和这个
${TW(结果['TotalWeightListResult'])
作为字符串读取,有没有一种方法可以将它拆分并转换成一个数字?像
${TW(result['totalweightslist']!?split(“,”)}
但这不起作用。@AaronMerin你是说
result['totalweightslist']
即使不丢失也是字符串吗?那是一个完全不同的问题。假设
s
包含字符串,那么您可以这样做:
s?split(“,”)map(it->it?trim?number)
。但您也有一个问题,即空字符串被拆分为
[“”]
,而不是拆分为
[]
。也要处理这个问题:
(s!?length==0)?然后([],s?split(“,”)映射(it->it?trim?number))
。将其放入一个正确命名的
#函数中
,以避免引起恐慌。。。或者,更好的是,该值应该作为数据模型中的
列表或数组出现。或者,这比
?然后
解决方案更干净:
s?split(,“”)过滤器(it->it?trim!=“”)映射(it->it?trim?编号)
。还要注意的是,
?过滤器
地图
需要FreeMarker 2.3.29。