Come selezionare il primo elemento di un set con JSTL?
Domanda
Sono riuscito a farlo con il codice successivo ma ci deve essere un modo più semplice.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<c:if test="${fn:length(attachments) > 0}">
<c:forEach var="attachment" items="${attachments}" varStatus="loopCount">
<c:if test="${loopCount.count eq 1}">
attachment.id
</c:if>
</c:forEach>
</c:if>
Soluzione
Puoi accedere a singoli elementi con l'operatore array []:
<c:out value="${attachments[0].id}" />
Funzionerà con matrici ed elenchi. Non funzionerà con mappe e set. In tal caso, devi inserire la chiave dell'elemento tra parentesi.
Altri suggerimenti
I set non hanno alcun ordine, ma se vuoi ancora ottenere il primo elemento puoi usare quanto segue:
<c:forEach var="attachment" items="${attachments}" end="0">
<c:out value="${attachment.id} />
</c:forEach>
Lavora solo per matrici ed elenchi, non per set.
Dato che ho un solo elemento nel mio set, l'ordine non è importante, quindi posso accedere al primo elemento in questo modo:
${ attachments.iterator().next().id }
Cerca qui per una descrizione di la variabile statusVar.
Puoi fare qualcosa come sotto, in cui lo stato " " La variabile contiene lo stato corrente dell'iterazione. Questo è molto utile se hai bisogno di annotazioni speciali per il primo e l'ultimo iteraton. Nel caso in basso voglio inserire la virgola dietro l'ultimo tag. Ovviamente puoi sostituire status.last
con status.first
per fare qualcosa di speciale sulla prima itterazione:
<td>
<c:forEach var="tag" items="${idea.tags}" varStatus="status">
<span>${tag.name not status.last ? ', ' : ''}</span>
</c:forEach>
</td>
Le opzioni possibili sono: corrente, indice, conteggio, primo, ultimo, inizio, passaggio,
e fine
Se vuoi solo il primo elemento di un set (e sei sicuro che ci sia almeno un elemento) puoi fare quanto segue:
<c:choose>
<c:when test="${dealership.administeredBy.size() == 1}">
Hello ${dealership.administeredBy.iterator().next().firstName},<br/>
</c:when>
<c:when test="${dealership.administeredBy.size() > 1}">
Hello Administrators,<br/>
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
È possibile utilizzare l'API Stream EL 3.0.
<div>${attachments.stream().findFirst().get()}</div>
Stai attento! Il API EL 3.0 Stream è stato finalizzato prima che API Java 8 Stream ed è diverso da quello. Non sono in grado di sradicare entrambe le API perché interromperà la compatibilità con le versioni precedenti.
L'uso di $ {mySet.toArray [0]} non funziona.
Non penso che sia possibile senza avere ogni ciclo almeno una iterazione.
L'uso di inizio e fine sembrava funzionare per me per selezionare una gamma di elementi. Questo mi dà tre elenchi separati. Il primo elenco con gli articoli 1-9, il secondo elenco con gli articoli 10-18 e l'ultimo elenco con gli articoli 11-25.
<ul>
<c:forEach items="${actionBean.top25Teams}" begin="0" end="8" var="team" varStatus="counter">
<li>${team.name}</li>
</c:forEach>
</ul>
<ul>
<c:forEach items="${actionBean.top25Teams}" begin="9" end="17" var="team" varStatus="counter">
<li>${team.name}</li>
</c:forEach>
</ul>
<ul>
<c:forEach items="${actionBean.top25Teams}" begin="18" end="25" var="team" varStatus="counter">
<li>${team.name}</li>
</c:forEach>
</ul>