Se eu tiver uma coleção, como Collection<String> strs
, como posso retirar o primeiro item? Eu poderia simplesmente chamar um Iterator
, pegar o primeiro next()
e depois jogar Iterator
fora. Existe uma maneira menos dispendiosa de fazer isso?
java
collections
iterable
Nick Heiner
fonte
fonte
Respostas:
Iterables.get (yourC, indexYouWant)
Porque, na verdade, se você estiver usando coleções, deve usar coleções do Google.
fonte
Parece que é a melhor maneira de fazer isso:
Ótima pergunta ... No começo, parece uma supervisão para o
Collection
interface.Observe que "first" nem sempre retorna a primeira coisa que você coloca na coleção e pode fazer sentido apenas para coleções ordenadas. Talvez seja por isso que não há uma
get(item)
ligação, pois a ordem não é necessariamente preservada.Embora possa parecer um pouco inútil, pode não ser tão ruim quanto você pensa. Ele
Iterator
realmente contém apenas informações de indexação na coleção, e não geralmente uma cópia de toda a coleção. A invocação desse método instancia oIterator
objeto, mas essa é realmente a única sobrecarga (não é como copiar todos os elementos).Por exemplo, olhando para o tipo retornado pelo
ArrayList<String>.iterator()
método, vemos que éArrayList::Itr
. Esta é uma classe interna que apenas acessa os elementos da lista diretamente, em vez de copiá-los.Apenas certifique-se de verificar o retorno,
iterator()
pois ele pode estar vazio ounull
dependendo da implementação.fonte
No java 8:
Para versões mais antigas do java, existe um método getFirst no Guava Iterables :
fonte
getFirst
método disponível. Existemget
egetLast
métodosNão existe o "primeiro" item em um
Collection
porque é ... bem, simplesmente uma coleção.No método Collection.iterator () do Java doc :
Então você não pode.
Se você usar outra interface, como Lista , poderá fazer o seguinte:
Mas diretamente de uma coleção, isso não é possível.
fonte
get(int n)
é definido paraCollection
Parece que sua coleção quer ser parecida com uma lista, então eu sugiro:
fonte
No Java 8, você tem muitos operadores para usar, por exemplo, limite
fonte
O Goiaba fornece um
onlyElement
Collector
, mas só o usa se você espera que a coleção tenha exatamente um elemento.Se você não tiver certeza de quantos elementos existem, use
findFirst
.fonte
Você pode fazer um casting. Por exemplo, se existe um método com esta definição e você sabe que esse método está retornando uma Lista:
E depois de invocá-lo, você precisa do primeiro elemento, pode fazê-lo assim:
fonte
Se você souber que a coleção é uma fila, poderá convertê-la em uma fila e obtê-la facilmente.
Existem várias estruturas que você pode usar para obter o pedido, mas precisará convertê-lo.
fonte
Depende totalmente de qual implementação você usou, se arraylist linkedlist ou outras implementações de set.
se estiver definido, você poderá obter diretamente o primeiro elemento, o loop pode ser um truque sobre a coleção, criar uma variável de valor 1 e obter valor quando o valor do sinalizador for 1 após a interrupção desse loop.
se for a implementação da lista, será fácil definir o número do índice.
fonte
Maneira funcional:
preservação de snippet de código acima de NullPointerException e IndexOutOfBoundsException
fonte
List<T>
não satisfazer a condição de que ele deve trabalhar para umCollection<String>
, mas é claro que pode ser corrigido usandoCollection<T>
, com a alteração adicional:.map(Collection::stream)
.Você poderia fazer isso:
O javadoc para Collection fornece a seguinte advertência por ordem dos elementos da matriz:
fonte