Si tengo una colección, como Collection<String> strs
, ¿cómo puedo obtener el primer artículo? Podría llamar a un Iterator
, tomar el primero next()
y luego tirarlo Iterator
. ¿Hay una manera menos derrochadora de hacerlo?
Si tengo una colección, como Collection<String> strs
, ¿cómo puedo obtener el primer artículo? Podría llamar a un Iterator
, tomar el primero next()
y luego tirarlo Iterator
. ¿Hay una manera menos derrochadora de hacerlo?
Respuestas:
Iterables.get (yourC, indexYouWant)
Porque realmente, si estás usando Colecciones, deberías estar usando Google Collections.
Parece que esa es la mejor manera de hacerlo:
String first = strs.iterator().next();
Gran pregunta ... Al principio, parece un descuido de la Collection
interfaz.
Tenga en cuenta que "primero" no siempre devolverá lo primero que ponga en la colección, y solo puede tener sentido para las colecciones ordenadas. Quizás es por eso que no hay una get(item)
llamada, ya que el orden no se conserva necesariamente.
Si bien puede parecer un poco derrochador, puede que no sea tan malo como crees. El Iterator
realmente solo contiene información de indexación en la colección, generalmente no es una copia de toda la colección. Invocar este método crea una instancia del Iterator
objeto, pero esa es realmente la única sobrecarga (no como copiar todos los elementos).
Por ejemplo, al observar el tipo devuelto por el ArrayList<String>.iterator()
método, vemos que es así ArrayList::Itr
. Esta es una clase interna que solo accede a los elementos de la lista directamente, en lugar de copiarlos.
Solo asegúrese de verificar el retorno de, iterator()
ya que puede estar vacío o null
dependiendo de la implementación.
En java 8:
Optional<String> firstElement = collection.stream().findFirst();
Para versiones anteriores de Java, hay un método en GetFirst guayaba iterables :
Iterables.getFirst(iterable, defaultValue)
getFirst
método disponible. Hay get
y getLast
métodos
No hay tal cosa como el "primer" elemento en un Collection
porque es ... bueno, simplemente una colección.
Del método Collection.iterator () de Java doc :
No hay garantías sobre el orden en que se devuelven los elementos ...
Entonces no puedes.
Si usa otra interfaz como Lista , puede hacer lo siguiente:
String first = strs.get(0);
Pero directamente desde una Colección esto no es posible.
get(int n)
se define paraCollection
Parece que su colección quiere ser como una lista, por lo que sugeriría:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
En Java 8 tiene muchos operadores para usar, por ejemplo, límite
/**
* 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);
}
Guava proporciona una onlyElement
Collector
, pero solo úsela si espera que la colección tenga exactamente un elemento.
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
Si no está seguro de cuántos elementos hay, úselos findFirst
.
Optional<String> optionalString = collection.stream().findFirst();
Puedes hacer un casting. Por ejemplo, si existe un método con esta definición, y sabe que este método está devolviendo una Lista:
Collection<String> getStrings();
Y después de invocarlo, necesita el primer elemento, puede hacerlo así:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
Si sabe que la colección es una cola, puede convertirla en una cola y obtenerla fácilmente.
Hay varias estructuras que puede usar para obtener el pedido, pero deberá emitirlo.
Depende totalmente de la implementación que haya utilizado, ya sea la lista de listas enlazadas u otras implementaciones de set.
si está configurado, puede obtener directamente el primer elemento, puede ser un bucle engañoso sobre la colección, crear una variable de valor 1 y obtener un valor cuando el valor del indicador es 1 después de ese salto.
si es la implementación de la lista, entonces es fácil definiendo el número de índice.
Forma funcional:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
fragmento de código anterior preservado de NullPointerException e IndexOutOfBoundsException
List<T>
no satisface la condición de que se debe trabajar para una Collection<String>
, pero por supuesto que se puede fijar utilizando Collection<T>
, con el cambio adicional: .map(Collection::stream)
.
Podrías hacer esto:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
El javadoc para Collection ofrece el siguiente orden de advertencia de los elementos de la matriz:
Si esta colección garantiza el orden en que sus iteradores devuelven sus elementos, este método debe devolver los elementos en el mismo orden.