Czy w Javie istnieje metoda narzędziowa, która generuje listę lub tablicę o określonej długości ze wszystkimi elementami równymi określonej wartości (np. ["Foo", "foo", "foo", "foo", "foo"])?
86
Możesz użyć Collections.nCopies
. Zauważ, że kopiuje to odniesienie do danego obiektu, a nie sam obiekt. Jeśli pracujesz ze stringami, nie ma to znaczenia, ponieważ i tak są one niezmienne.
List<String> list = Collections.nCopies(5, "foo");
System.out.println(list);
[foo, foo, foo, foo, foo]
Dla tablicy możesz użyć Arrays.fill (Object [] a, Object val)
String[] strArray = new String[10]; Arrays.fill(strArray, "foo");
a jeśli potrzebujesz listy, po prostu użyj
Możesz użyć Collections.nCopies (5, "foo") jako jednowierszowego rozwiązania, aby uzyskać listę:
List<String> strArray = Collections.nCopies(5, "foo");
lub połącz go z,
toArray
aby uzyskać tablicę.String[] strArray = Collections.nCopies(5, "foo").toArray(new String[5]);
źródło
String[] strArray = new String[5]; Arrays.fill(strArray, "foo");
. Czy istnieje rozwiązanie jednokreskowe?Wersja, której można używać dla tablic pierwotnych (Java 8):
DoubleStream.generate(() -> 123.42).limit(777).toArray(); // returns array of 777 123.42 double vals
Zauważ, że zwraca
double[]
, nieDouble[]
Działa dla IntegerStream, DoubleStream, LongStream
UPD
a dla dup ciągów możesz użyć:
Stream.generate(() -> "value").limit(400).toArray()
Nie są wymagane żadne dodatkowe biblioteki, jedna linia
źródło
Jeśli twój obiekt nie jest niezmienny lub nie jest przezroczysty dla odniesienia, możesz użyć
Stream.generate(YourClass::new).limit(<count>)
i zbierz go na listę
lub do szyku
.toArray(YourClass[]::new)
źródło
Używając
IntStream
, możesz wygenerować zakres liczb całkowitych, zmapować je na żądany element i zebrać jako listę.List<String> list = IntStream.rangeClosed(0, 5) .mapToObj(i -> "foo") .collect(Collectors.toList());
Lub jako tablica
String[] arr = IntStream.rangeClosed(0, 5) .mapToObj(i -> "foo") .toArray(String[]::new);
źródło