Se ho una collezione, ad esempio Collection<String> strs
, come posso estrarre il primo oggetto? Potrei semplicemente chiamare un Iterator
, prendere il suo primo next()
e poi buttarlo Iterator
via. C'è un modo meno dispendioso per farlo?
Se ho una collezione, ad esempio Collection<String> strs
, come posso estrarre il primo oggetto? Potrei semplicemente chiamare un Iterator
, prendere il suo primo next()
e poi buttarlo Iterator
via. C'è un modo meno dispendioso per farlo?
Risposte:
Iterables.get (yourC, indexYouWant)
Perché in realtà, se utilizzi le raccolte, dovresti utilizzare le raccolte di Google.
Sembra che questo sia il modo migliore per farlo:
String first = strs.iterator().next();
Ottima domanda ... All'inizio sembra una svista per l' Collection
interfaccia.
Nota che "first" non restituirà sempre la prima cosa che hai inserito nella raccolta e potrebbe avere senso solo per le raccolte ordinate. Forse è per questo che non c'è una get(item)
chiamata, poiché l'ordine non è necessariamente preservato.
Anche se potrebbe sembrare un po 'dispendioso, potrebbe non essere così grave come pensi. In Iterator
realtà contiene solo le informazioni di indicizzazione nella raccolta, di solito non una copia dell'intera raccolta. Invocare questo metodo crea un'istanza Iterator
dell'oggetto, ma questo è davvero l'unico overhead (non come copiare tutti gli elementi).
Ad esempio, guardando il tipo restituito dal ArrayList<String>.iterator()
metodo, vediamo che lo è ArrayList::Itr
. Questa è una classe interna che accede direttamente agli elementi dell'elenco, invece di copiarli.
Assicurati solo di controllare il ritorno di iterator()
poiché potrebbe essere vuoto o in null
base all'implementazione.
getFirst
metodo disponibile. Ci sono get
e getLast
metodi
Non esiste un "primo" elemento in un Collection
perché è .. beh, semplicemente una collezione.
Dal metodo Collection.iterator () del documento Java :
Non ci sono garanzie sull'ordine in cui gli elementi vengono restituiti ...
Quindi non puoi.
Se utilizzi un'altra interfaccia come List , puoi eseguire le seguenti operazioni:
String first = strs.get(0);
Ma direttamente da una Collezione questo non è possibile.
get(int n)
sia definito perCollection
Sembra che la tua raccolta desideri essere simile a un elenco, quindi suggerirei:
List<String> myList = new ArrayList<String>();
...
String first = myList.get(0);
In Java 8 hai molti operatori da usare, ad esempio 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);
}
Guava fornisce un onlyElement
Collector
, ma usalo solo se ti aspetti che la raccolta abbia esattamente un elemento.
Collection<String> stringCollection = ...;
String string = collection.stream().collect(MoreCollectors.onlyElement())
Se non sei sicuro di quanti elementi ci siano, usa findFirst
.
Optional<String> optionalString = collection.stream().findFirst();
Modo funzionale:
public static <T> Optional<T> findFirst(List<T> result) {
return Optional.ofNullable(result)
.map(List::stream)
.flatMap(Stream::findFirst);
}
lo snippet di codice sopra riportato conserva da NullPointerException e IndexOutOfBoundsException
List<T>
non soddisfa la condizione che dovrebbe lavorare per una Collection<String>
, ma, naturalmente, che può essere fissato utilizzando Collection<T>
, con il cambio supplementare: .map(Collection::stream)
.
Se sai che la raccolta è una coda, puoi eseguire il cast della raccolta in una coda e ottenerla facilmente.
Esistono diverse strutture che puoi utilizzare per ottenere l'ordine, ma dovrai eseguire il cast.
Dipende totalmente dall'implementazione che hai usato, se arraylist linkedlist, o altre implementazioni di set.
se è impostato, puoi ottenere direttamente il primo elemento, il loro può essere un loop di trucco sulla raccolta, creare una variabile di valore 1 e ottenere valore quando il valore del flag è 1 dopo l'interruzione del ciclo.
se è l'implementazione della lista, allora è facile definendo il numero di indice.
Puoi fare un casting. Ad esempio, se esiste un metodo con questa definizione e sai che questo metodo restituisce un elenco:
Collection<String> getStrings();
E dopo averlo invocato, hai bisogno del primo elemento, puoi farlo in questo modo:
List<String> listString = (List) getStrings();
String firstElement = (listString.isEmpty() ? null : listString.get(0));
Potresti farlo:
String strz[] = strs.toArray(String[strs.size()]);
String theFirstOne = strz[0];
Il javadoc per Collection fornisce il seguente avvertimento rispetto all'ordine degli elementi dell'array:
Se questa raccolta fornisce garanzie sull'ordine in cui i suoi elementi vengono restituiti dal suo iteratore, questo metodo deve restituire gli elementi nello stesso ordine.