在 Map<Integer, List<String>> in JSTL <c:if> 中确定列表的大小

Determine size of list in Map<Integer, List<String>> in JSTL <c:if>

我有以下地图:

Map<Integer, List<String>> namesById= new HashMap<>() ;

我想遍历 jsp 中的地图。但是,首先我想先检查列表大小是否大于某个数字。

所以我想要的是这个(把测试编号用于演示目的):

if (namesById.get(1).size() > 3)
for (String s: namesById.get(1)){
        do something
   }

我需要在 JSP 完成。由于我是 JSTL 的初学者,所以我不知道如何编写它,而且很难调试。我试过这个表达式:

<c:if test="${fn:length(namesById[1]) gt 3}"

</c:if>

所以我想做的是:

  1. 首先通过给出特定的键从地图中获取列表
  2. 然后检查列表的大小是否大于某个数字
  3. 然后遍历列表

使用 Jstl,您可以从 map.Using 获取键和值,您可以检查 size.Check 下面的示例。

<%
    Map<Integer, List<String>> namesById = new HashMap<Integer, List<String>>();

    List<String> list = new ArrayList<String>();
    list.add("1");
    list.add("2");
    list.add("3");
    list.add("4");
    namesById.put(1, list);

    list=new ArrayList<String>();
    list.add("3");
    list.add("4");
    namesById.put(2, list);
    pageContext.setAttribute("itemList", namesById);
%>


<c:forEach items="${itemList}" var="entry">
  <c:if test="${fn:length(entry.value) gt 3}">
    Value > 3
  </c:if>
</c:forEach>

那是因为

Integer.valueOf(1).equals(Long.valueOf(1))

总是false

在表达式语言中,</code> 被解释为 <code>Long,这与 Integer 键不匹配。基本上,您实际上是在此处执行 namesById.get(1L)

将您的地图更改为 Map<Long, List<String>> 即可。