Jeśli mam kolekcję, np. Collection<String> strs
Jak mogę uzyskać pierwszy przedmiot? Mógłbym po prostu zadzwonić Iterator
, wziąć pierwszy next()
, a potem wyrzucić Iterator
. Czy istnieje mniej marnotrawny sposób?
java
collections
iterable
Nick Heiner
źródło
źródło
Odpowiedzi:
Iterables.get (yourC, indexYouWant)
Ponieważ tak naprawdę, jeśli używasz kolekcji, powinieneś używać kolekcji Google.
źródło
Wygląda na to, że jest to najlepszy sposób:
Świetne pytanie ... Na początku wydaje się to niedopatrzeniem
Collection
interfejsu.Pamiętaj, że „pierwsze” nie zawsze zwróci pierwszą rzecz, którą umieścisz w kolekcji, i może mieć sens tylko w przypadku zamówionych kolekcji. Być może dlatego nie ma
get(item)
połączenia, ponieważ kolejność niekoniecznie jest zachowana.Choć może wydawać się to trochę marnotrawstwem, może nie być tak złe, jak myślisz.
Iterator
Naprawdę tylko zawiera informacje indeksowania do kolekcji, a nie zwykle kopię całej kolekcji. Wywołanie tej metody tworzy instancjęIterator
obiektu, ale tak naprawdę jest to jedyny narzut (nie tak jak kopiowanie wszystkich elementów).Na przykład, patrząc na typ zwracany przez
ArrayList<String>.iterator()
metodę, widzimy, że tak jestArrayList::Itr
. Jest to klasa wewnętrzna, która po prostu uzyskuje bezpośredni dostęp do elementów listy, zamiast je kopiować.Pamiętaj tylko o sprawdzeniu zwrotu,
iterator()
ponieważ może być pusty lubnull
zależy od implementacji.źródło
W java 8:
W starszych wersjach java istnieje metoda getFirst w Guava Iterables :
źródło
getFirst
dostępnej metody. Istniejąget
igetLast
metodyNie ma czegoś takiego jak „pierwszy” element w
Collection
ponieważ jest to… no cóż, kolekcja.Z metody Collection.iterator () Java doc :
Więc nie możesz.
Jeśli używasz innego interfejsu, takiego jak Lista , możesz wykonać następujące czynności:
Ale bezpośrednio z kolekcji nie jest to możliwe.
źródło
get(int n)
jest zdefiniowany dlaCollection
Wygląda na to, że Twoja kolekcja chce być podobna do listy, więc sugeruję:
źródło
W Javie 8 masz do dyspozycji wielu operatorów, na przykład limit
źródło
Guava zapewnia
onlyElement
Collector
, ale używaj go tylko wtedy, gdy oczekujesz, że kolekcja będzie miała dokładnie jeden element.Jeśli nie masz pewności, ile jest elementów, użyj
findFirst
.źródło
Możesz wykonać casting. Na przykład, jeśli istnieje jedna metoda z tą definicją i wiesz, że ta metoda zwraca listę:
A po wywołaniu potrzebujesz pierwszego elementu, możesz to zrobić w następujący sposób:
źródło
Jeśli wiesz, że kolekcja jest kolejką, możesz rzucić kolekcję do kolejki i łatwo ją zdobyć.
Istnieje kilka struktur, z których możesz skorzystać, aby uzyskać zamówienie, ale musisz do niego rzucić.
źródło
Zależy to całkowicie od zastosowanej implementacji, listy połączonych arraylist lub innych implementacji zestawu.
jeśli jest ustawiony, możesz bezpośrednio uzyskać pierwszy element, może to być pętla trick nad kolekcją, utwórz zmienną o wartości 1 i uzyskaj wartość, gdy wartość flagi wynosi 1 po tym przerwaniu tej pętli.
jeśli jest to implementacja listy, to łatwo jest zdefiniować numer indeksu.
źródło
Funkcjonalny sposób:
powyżej zachowaj fragment kodu z NullPointerException i IndexOutOfBoundsException
źródło
List<T>
nie spełnia warunku, że powinien pracować dlaCollection<String>
, ale oczywiście, że mogą być ustalane za pomocąCollection<T>
, z dodatkową zmianą:.map(Collection::stream)
.Możesz to zrobić:
Program javadoc dla kolekcji podaje następujące zastrzeżenie dotyczące uporządkowania elementów tablicy:
źródło