Załóżmy, że mamy plik Collection<Foo>
. Jaki jest najlepszy (najkrótszy w LoC w obecnym kontekście) sposób, aby go przekształcić Foo[]
? Wszelkie dobrze znane biblioteki są dozwolone.
UPD: (jeszcze jeden przypadek w tej sekcji; zostaw komentarz, jeśli uważasz, że warto utworzyć dla niego kolejny wątek): A co z transformacją Collection<Foo>
do Bar[]
gdzie Bar
ma konstruktor z 1 parametrem typu Foo
tj. public Bar(Foo foo){ ... }
?
java
arrays
collections
transformation
rzymski
źródło
źródło
Stream.toArray
interfejsem API z JDK.Odpowiedzi:
Gdzie
x
jest kolekcja:źródło
x.toArray(new Foo[0])
--- dokumentacja : nie ma czasu na czytanie ...(new Foo[0])
. Zgodnie z dokumentacją Collection.toArray, `@param a tablica, w której mają być przechowywane elementy tej kolekcji, jeśli jest wystarczająco duża`, co oznacza, że będzie przechowywać je bezpośrednio w tej nowej tablicy. Jeśli nadasz mu tablicę o rozmiarze 0, utworzy nową tablicę, co oznacza, że masz małą tablicę i dużą tablicę, która jest tworzona, gdy taka jest niepotrzebna.toArray
tworzenia docelowej tablicy odpowiedniego typu. I w tym przypadku, szczerze, nie obchodziłabym jedna dodatkowa pusta tablica w mojej aplikacji. To znacznie poniżej poziomu hałasu.new Foo[0]
jest prostsze "ale nie najlepsze (pamięć)" ... czyli chodziło mi o to, że moje rozwiązanie jest łatwiejsze, ale nie najlepsze (z tego powodu użyłem:
).new Foo[0]
Wariant zaproponowany przez Carlos nie cierpi tego problemu.Alternatywne rozwiązanie zaktualizowanego pytania za pomocą Java 8:
źródło
Bar[] result = foos.stream().map(Bar::new).toArray(Bar[]::new);
Jeśli używasz go więcej niż raz lub w pętli, możesz zdefiniować stałą
i zrób konwersję tak, jak chcesz
Plik
toArray
Metoda zajmie pustą tablicę, aby ustalić właściwy rodzaj tablicy docelowej i stworzyć nową tablicę dla Ciebie.Oto moja propozycja aktualizacji:
źródło
const
to nie Java!public static final Foo[] FOO = {}
import static
aby się do nich dostać.W przypadku JDK / 11 alternatywnym sposobem konwersji a
Collection<Foo>
na anFoo[]
może być wykorzystanieCollection.toArray(IntFunction<T[]> generator)
jako:Jak wyjaśnił @Stuart na liście mailingowej ( wyróżnienie moje), wydajność powinna być zasadniczo taka sama, jak w przypadku istniejącej
Collection.toArray(new T[0])
-Implementacja API w JDK czyta:
Uwaga : - Tylko, że użycie API powinno być prowadzone wraz z wsteczną niezgodnością, gdy jest używany do kodu z
null
wartościami, np.toArray(null)
Ponieważ te wywołania byłyby teraz niejednoznaczne z powodu istnieniatoArray(T[] a)
i nie mogłyby się skompilować.źródło
Jeśli używasz guawy w swoim projekcie, możesz użyć
Iterables::toArray
.źródło
Oryginał znajduje się w podwójnej odpowiedzi:
Co do aktualizacji:
źródło
Oto ostateczne rozwiązanie sprawy w sekcji aktualizacji (z pomocą Google Collections):
Ale kluczowe podejście tutaj zostało wspomniane w odpowiedzi doublep (zapomniałem o
toArray
metodzie).źródło
new Bar[0]
unika problemu.Na przykład masz kolekcję ArrayList z elementami Student class:
źródło