【问题标题】:Velocity foreach sort list速度 foreach 排序列表
【发布时间】:2014-01-09 09:02:13
【问题描述】:

谁能建议如何按速度对这个列表进行排序?

到目前为止我尝试过

    #foreach($it in ${pro.test}.sort(${pro.test.sortOrder})) 
    .........
    #end

但它抛出错误,我也尝试过

    #foreach($it in ${pro.test.sort(${pro.test.sortOrder})})
    .........
    #end

这次没有错误,但控件没有进入循环,

reference

【问题讨论】:

  • pro.test是什么类型的对象?
  • @Sergiu Dumitriu 感谢您的回复,这是一套。我也尝试了 $sorter.sort() 函数,你能告诉我哪里出错了

标签: java foreach velocity


【解决方案1】:

首先,使用${...} 是一种帮助 Velocity 解析器准确了解您认为是 Velocity 代码的方法。通常,当velocity 看到$something.somethingElse.somethingMore 时,它会尝试尽可能多地解析,直到看到一个断字字符,例如空格或逗号。当它看到${something.somethingElse}.somethingMore 时,它只会读取匹配的} 作为实际代码,其余的是纯文本。这意味着${pro.test}.sort(...).sort(...) 视为应打印的纯文本,因此它不会将其称为方法。这就是第一个示例因错误而失败的原因。您只需要在指令之外使用正式语法,但是,您可以在 #foreach(...) 内部时从调用中删除所有 {}

其次,#foreach 非常宽松,当你尝试在迭代范围内传递无效的东西时它不会报错;如果它不能解析为一个有效的列表,那么它会简单地忽略它并认为没有什么可以迭代。当某些事情没有按预期工作时,打印您正在使用的值:

$pro.test $pro.test.class $pro.test.sortOrder $pro.test.sortOrder.class
#foreach ($it in ${pro.test.sort(${pro.test.sortOrder})})
  ...
#end

打印的是什么? $pro.test真的是一套吗? $pro.test.sortOrder 是否像 SortTool 所期望的那样是一个有效的排序顺序规范?

如果$pro.testSet interface 的标准实现,则没有sortsortOrder 方法。假设 Velocity SortTool$sorter 变量下可用,对于初学者,您可以尝试:

#foreach ($it in $sorter.sort($pro.test))
   ...
#end

现在,$pro.test.sortOrder 到底应该是什么?如果它是一个属性,请注意,出于安全原因,Velocity 不允许直接访问属性,它只能调用方法。作为一种简化语法的方法,$pro.test.sortOrder 实际上会尝试调用其中一个:getsortOrder()getSortOrder()get("sortOrder")issortOrder()isSortOrder()

【讨论】:

  • 非常感谢您的精彩解释和时间。我会尽快检查您的代码。
猜你喜欢
  • 2016-11-15
  • 2021-07-14
  • 2012-08-20
  • 1970-01-01
  • 2020-12-13
  • 2011-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
相关资源
最近更新 更多