web-dev-qa-db-fra.com

Java: Obtenir le premier élément d'une collection

Si j'ai une collection, telle que Collection<String> strs, comment puis-je obtenir le premier élément? 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?

249
Nick Heiner

Iterables.get (yourC, indexYouWant)

En réalité, si vous utilisez Collections, vous devriez utiliser Google Collections.

125
Carl

On dirait que c'est la meilleure façon de le faire:

String first = strs.iterator().next();

Excellente question ... Au début, cela ressemble à un oubli de l'interface Collection.

Notez que "premier" ne renverra pas toujours la première chose que vous avez insérée dans la collection et peut avoir un sens pour les collections ordonnées. C'est peut-être pour cette raison qu'il n'y a pas d'appel get(item), puisque l'ordre n'est pas nécessairement conservé.

Bien que cela puisse sembler un peu inutile, cela pourrait ne pas être aussi grave que vous le pensez. La Iterator ne contient en réalité que des informations d'indexation dans la collection, et non une copie de la collection complète. L'appel de cette méthode instancie l'objet Iterator, mais il s'agit en réalité du seul surdébit (et non de la copie de tous les éléments).

Par exemple, en regardant le type renvoyé par la méthode ArrayList<String>.iterator(), nous voyons qu'il s'agit de ArrayList::Itr. Il s'agit d'une classe interne qui accède directement aux éléments de la liste, plutôt que de les copier.

Assurez-vous simplement de vérifier le retour de iterator() puisqu'il peut être vide ou null, selon l'implémentation.

394
jheddings

Dans Java 8:

Optional<String> firstElement = collection.stream().findFirst();

Pour les anciennes versions de Java, il existe une méthode getFirst dans Guava Iterables :

Iterables.getFirst(iterable, defaultValue)
75
Vitalii Fedorenko

Il n’existe pas de "premier" élément dans un Collection car c’est .. bien tout simplement une collection.

De la méthode Java doc --- Collection.iterator () :

Il n'y a aucune garantie concernant l'ordre dans lequel les éléments sont retournés ...

Donc vous ne pouvez pas.

Si vous utilisez une autre interface telle que List , vous pouvez procéder comme suit: :

String first = strs.get(0);

Mais directement à partir d'une collection, ce n'est pas possible.

38
OscarRyz

On dirait que votre collection veut être comme une liste, alors je vous suggère:

List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
4
Jim Ferrans

Dans Java 8, vous avez plusieurs opérateurs à utiliser, par exemple limit

     /**
 * Operator that limit the total number of items emitted through the pipeline
 * Shall print
 * [1]
 * @throws InterruptedException
 */
@Test
public void limitStream() throws InterruptedException {
    List<Integer> list = Arrays.asList(1, 2, 3, 1, 4, 2, 3)
                               .stream()
                               .limit(1)
                               .collect(toList());
    System.out.println(list);
}
2
paul

Guava fournit une onlyElementCollector, mais ne l'utilisez que si vous vous attendez à ce que la collection contienne exactement un élément.

Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())

Si vous n'êtes pas sûr du nombre d'éléments, utilisez findFirst.

Optional<String> optionalString = collection.stream().findFirst();
1
cambunctious

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:

Collection<String> getStrings();

Et après l'invocation, vous avez besoin du premier élément, vous pouvez le faire comme ceci:

List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
1
Nacho Soriano

Cela dépend totalement de l'implémentation que vous avez utilisée, qu'il s'agisse d'une liste liée d'arraylist ou d'autres implémentations de set.

si elle est définie, vous pouvez directement obtenir le premier élément, leur boucle peut être superposée sur la collection, créer une variable de valeur 1 et obtenir une valeur lorsque la valeur de l'indicateur est 1 après la rupture de cette boucle.

si c'est la mise en œuvre de la liste, il est facile de définir le numéro d'index.

0
Sindhoo Oad

Si vous savez que la collection est une file d'attente, vous pouvez la convertir en file d'attente et l'obtenir facilement.

Il existe plusieurs structures que vous pouvez utiliser pour obtenir cet ordre, mais vous devrez lui attribuer un casting.

0
James Black