【发布时间】:2014-03-24 02:53:34
【问题描述】:
我有一组具有某些属性的对象。一个属性只能是Type1 和Type2 两种类型。
我要做的就是检查一个对象是否具有Type1 的属性。
我正在使用以下代码:
<c:set var="properties" value="${obj.getProperties()}"/>
<c:set var="hasPropertyOfType1" value="false"/>
<c:forEach var="i" begin="0" end="${fn:length(properties) - 1}">
<c:if test="${properties.get(i).isOfType1() eq true}">
<c:set var="hasPropertyOfType1" value="true"/>
</c:if>
</c:forEach>
上面的代码实现了我想要的,但是效率非常低,因为一个对象可能拥有的属性数量非常多。
所以我的问题是,一旦我将hasPropertyOfType1 设置为等于true,如何跳出forEach 循环。
我想到的一些方法,但我不知道如何实现(或者它们甚至可能)是:
1:在 forEach 循环中添加一个条件来停止循环。
2:将循环内的索引值增加到大于fn:length(properties)的值。
3:尽可能使用break语句。
我已经搜索了很多,但仍然无法弄清楚这一点。提前致谢。
【问题讨论】:
-
你为什么不做正确的事并在你的对象中添加一个方法
boolean isPropertyOfType1Present()? -
@JBNizet 这本来是理想的情况,但不幸的是,该代码不在我的控制之下,据我所知,目前无法更改。
-
你不能将它包装在你自己的对象中,它会提供这种方法吗?或者只是在控制器中计算它并将其添加为请求属性?这应该在 Java 中完成,而不是在 JSTL 中。
-
@JBNizet 我同意这应该在 Java 中完成,但是与添加一个简单的 break 语句相比,这需要付出很多努力。展望未来,我也许可以添加
isPropertyOfType1Present(),但现在我想要一个临时解决方法。 -
@JBNizet 这不是不好的做法,因为我们应该将演示代码与业务逻辑分开?