2011-07-30 11 views
6

Czy istnieje lepsza alternatywa dla używania Arrays.asList jako inicjatora zbiorczego listy? Obawiam się, że ta jest pełna i obejmuje nieistniejącą klasę i metodę.jest lepsza alternatywa dla inicjowania listy <T> niż wywoływanie Arrays.asList?

List<Double> myList = new ArrayList<Double>(Arrays.asList(3.01d, 4.02d, 5.03d)); 

Edytuj: To pytanie dotyczy inicjalizacji zbiorczej, która zwykle zawiera więcej niż trzy wartości pokazane w przykładzie.

+0

To wygląda idealnie dobrze (jak również optymalizacja sugerowana przez MatrixFrog, jeśli lista będzie tylko do odczytu). Wywołanie pojedynczej metody podczas inicjalizacji nie ma znaczenia, jeśli chodzi o wydajność. – JimN

Odpowiedz

5

Jeśli wiesz, że nie trzeba niczego dodawać do lista później, można po prostu zrobić

List<Double> myList = Arrays.asList(3.01d, 4.02d, 5.03d); 

Jestem całkiem pewien, że lista wrócił z Arrays.asList można mod jeśli nie, możesz zmienić elementy, które tam są - nie możesz dodawać do niego nowych elementów.

1

Innym rozwiązaniem byłoby jako anonimowej klasy wewnętrznej:

List<Double> myList = new ArrayList() { 
{ 
    add(3.01d); 
    add(4.02d); 
    add(5.03d); 
} 
}; 
+0

Edytowałem pytanie, aby było jasne, że jest to inicjalizacja zbiorcza. – H2ONaCl

+0

@Broiyan Ok, zredagowałem moją odpowiedź z inną alternatywą. –

1

Tak, można to zrobić tak:

List<Double> myList = Arrays.asList(new Double[]{3.01d, 4.02d, 5.03d}); 
// or 
List<Double> myList = Arrays.asList(3.01d, 4.02d, 5.03d); 
+2

Przydzielenie 'Double []' nie jest konieczne, ponieważ 'Arrays.asList' ma postać" varargs ". – MatrixFrog

+2

Należy zauważyć, że lista zwrócona przez 'Arrays.asList (...)' jest wspierana przez daną tablicę, a zatem * stała-długość *. Aby zademonstrować, spróbuj wywołać 'myList.add (1.0d)' po zainicjowaniu listy, a otrzymasz wyjątek UnsupportedOperationException. Jeśli chcesz dodać więcej elementów do listy w pewnym momencie, przekaż wynik metody 'asList (...)' do konstruktora kopiowania ArrayList. –

3

Zastosowanie guava,

List<Double> myList = Lists.newArrayList(3.01d, 4.02d, 5.03d)); 
0

nie pasuje do zapytania 100%, ale dodając tę ​​odpowiedź w przypadku, gdy chcąc instatiate listy po prostu, aby móc natychmiast coś zrobić z wartościami w nim, a po prostu tworzenie instancji listy ze względu na sam proces tworzenia instancji.

Używając Java 8 można użyć Stream.of(T... values), a następnie manipulować w parze za pośrednictwem API strumienia, aby uzyskać pożądane wyniki z listy wartości.

Na przykład, aby uzyskać maksymalną wartość szeregu wartości ...

int maxValue = Stream.of(10, 5, 25).max(Integer::compareTo).get();

Powyższy przykład jest również pomocne, gdy chcesz Math.max(#,#) typu funkcjonalność, ale mają więcej niż dwa argumenty proces.

0

Od java 9 jesteś w stanie wykorzystać List.of metody fabryki:

static <E> List<E> of​(E... elements) 

zwraca niezmienny listę zawierającą dowolną liczbę elementów.

lub użyj guawa:

public static <E> ImmutableList<E> of(E e1, E e2,...) 

Zwraca niezmienny wykaz zawierający elementy podane w zamówieniu.

Powiązane problemy