Si j'ai une collection, par exemple Collection<String> strs
, comment puis-je retirer le premier article? Je pourrais simplement appeler un Iterator
, prendre son premier next()
, puis jeter le Iterator
. Y a-t-il une façon moins inutile de le faire?
java
collections
iterable
Nick Heiner
la source
la source
Réponses:
Iterables.get (yourC, indexYouWant)
Parce que vraiment, si vous utilisez des collections, vous devriez utiliser Google Collections.
la source
On dirait que c'est la meilleure façon de le faire:
Grande question ... Au début, cela ressemble à un oubli pour
Collection
interface.Notez que "premier" ne retournera pas toujours la première chose que vous avez mise dans la collection, et peut seulement avoir un sens pour les collections ordonnées. C'est peut-être pour cela qu'il n'y a pas d'
get(item)
appel, car l'ordre n'est pas nécessairement conservé.Bien que cela puisse sembler un peu inutile, ce n'est peut-être pas aussi mauvais que vous le pensez. Le
Iterator
contient vraiment juste des informations d'indexation dans la collection, pas habituellement une copie de la collection entière. L'invocation de cette méthode instancie l'Iterator
objet, mais c'est vraiment la seule surcharge (pas comme copier tous les éléments).Par exemple, en regardant le type retourné par la
ArrayList<String>.iterator()
méthode, nous voyons qu'il l'estArrayList::Itr
. Il s'agit d'une classe interne qui accède simplement aux éléments de la liste directement, plutôt que de les copier.Assurez-vous simplement de vérifier le retour de
iterator()
car il peut être vide ounull
dépendre de l'implémentation.la source
En java 8:
Pour les anciennes versions de java, il existe une méthode getFirst dans Guava Iterables :
la source
getFirst
méthode disponible. Il existeget
et desgetLast
méthodesIl n'y a pas de "premier" article dans un
Collection
parce que c'est ... enfin simplement une collection.À partir de la méthode Collection.iterator () du document Java :
Vous ne pouvez donc pas.
Si vous utilisez une autre interface telle que List , vous pouvez effectuer les opérations suivantes:
Mais directement à partir d'une collection, ce n'est pas possible.
la source
get(int n)
c'est défini pourCollection
Il semble que votre collection veuille ressembler à une liste, je suggère donc:
la source
Dans Java 8, vous avez de nombreux opérateurs à utiliser, par exemple limit
la source
Guava fournit un
onlyElement
Collector
, mais ne l'utilisez que si vous vous attendez à ce que la collection ait exactement un élément.Si vous n'êtes pas sûr du nombre d'éléments, utilisez
findFirst
.la source
Vous pouvez faire un casting. Par exemple, s'il existe une méthode avec cette définition et que vous savez que cette méthode renvoie une liste:
Et après l'avoir invoqué, vous avez besoin du premier élément, vous pouvez le faire comme ceci:
la source
Si vous savez que la collection est une file d'attente, vous pouvez caster la collection dans une file d'attente et l'obtenir facilement.
Il existe plusieurs structures que vous pouvez utiliser pour obtenir la commande, mais vous devrez y caster.
la source
Cela dépend totalement de l'implémentation que vous avez utilisée, qu'il s'agisse d'une liste de liens arraylist ou d'autres implémentations de set.
s'il est défini, vous pouvez directement obtenir le premier élément, leur boucle peut être trompeuse sur la collection, créer une variable de valeur 1 et obtenir la valeur lorsque la valeur de l'indicateur est 1 après cette rupture de cette boucle.
s'il s'agit d'une implémentation de liste, il est facile de définir le numéro d'index.
la source
Manière fonctionnelle:
au-dessus d'extrait de code préservé de NullPointerException et IndexOutOfBoundsException
la source
List<T>
ne satisfait pas à la condition que cela devrait fonctionner pour unCollection<String>
, mais bien sûr , qui peut être fixé à l' aideCollection<T>
, avec le changement supplémentaire:.map(Collection::stream)
.Vous pouvez faire ceci:
Le javadoc pour Collection donne l'ordre de mise en garde suivant des éléments du tableau:
la source