Mam tablicę, którą chciałbym zamienić na a List
, aby zmodyfikować zawartość tablicy.
Przepełnienie stosu ma mnóstwo pytań / odpowiedzi, adres Arrays.asList()
i jak tylko zapewnia widok na liście podstawowej tablicy, a jak próbuje manipulować wynikowej liście będzie ogólnie rzucić UnsupportedOperationException
jako metod stosowanych do manipulowania listy (np add()
, remove()
etc.) są nie zaimplementowane przez implementację listy dostarczoną przez Arrays.asList()
.
Ale nie mogę znaleźć przykładu, jak zamienić tablicę w zmienną listę. Przypuszczam, że mogę przechodzić przez tablicę i put()
każdą wartość do nowej listy, ale zastanawiam się, czy istnieje interfejs, który może to zrobić za mnie.
A jeśli używasz Google Collection API (Guava):
źródło
new ArrayList<>(Arrays.asList(...))
- javadoc dla tej metody sugeruje, że stanie się ona przestarzała, ponieważ nie jest wystarczająco przydatna.Ten prosty kod wykorzystujący Stream API zawarty w Javie 8 tworzy zmienną listę (lub widok) zawierającą elementy twojej tablicy:
Foo[] array = ...; List<Foo> list = Stream.of(array).collect(Collectors.toCollection(ArrayList::new));
Lub równie ważne:
List<Foo> list = Arrays.stream(array).collect(Collectors.toCollection(ArrayList::new));
źródło
Jeśli używasz kolekcji Eclipse (dawniej GS Kolekcje ), możesz użyć
FastList.newListWith(...)
lubFastList.wrapCopy(...)
.Obie metody pobierają varargs, więc możesz utworzyć tablicę w linii lub przekazać w istniejącej tablicy.
MutableList<Integer> list1 = FastList.newListWith(1, 2, 3, 4); Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2);
Różnica między tymi dwiema metodami polega na tym, czy tablica zostanie skopiowana.
newListWith()
nie kopiuje tablicy i dlatego zajmuje stały czas. Powinieneś unikać jego używania, jeśli wiesz, że tablica może zostać zmutowana w innym miejscu.Integer[] array2 = {1, 2, 3, 4}; MutableList<Integer> list2 = FastList.newListWith(array2); array2[1] = 5; Assert.assertEquals(FastList.newListWith(1, 5, 3, 4), list2); Integer[] array3 = {1, 2, 3, 4}; MutableList<Integer> list3 = FastList.wrapCopy(array3); array3[1] = 5; Assert.assertEquals(FastList.newListWith(1, 2, 3, 4), list3);
Uwaga: jestem promotorem Eclipse Collections.
źródło
myNewArrayList = new ArrayList<>(Arrays.asList(myArray));
źródło
myNewArrayList = new ArrayList(...)
, tj. Typu surowego? Istnieje różnica między „użyciem operatora diamentu, aby kompilator opracował argument typu”, a „użyciem surowego typu”.Dodanie kolejnej opcji za pomocą Streams API:
źródło