Istnieje kilka sposobów, aby to zrobić.
Jednym z nich jest z parą zagnieżdżony IntStreams
przez indeksy wierszy i kolumn:
String[][] testStream() {
String[][] array = new String[3][3];
IntStream.range(0, array.length).forEach(x ->
IntStream.range(0, array[x].length).forEach(y ->
array[x][y] = String.format("%c%c", letter(x), letter(y))));
return array;
}
Innym sposobem, który wydaje się być obiecujące jest stosowanie Array.setAll
zamiast strumieni. Jest to doskonałe do generowania wartości dla jednowymiarowej tablicy: udostępniasz funkcję, która odwzorowuje indeks tablicy na wartość, którą chcesz przypisać w tablicy. Na przykład można to zrobić:
String[] sa = new String[17];
Arrays.setAll(sa, i -> letter(i));
Niestety jest to mniej wygodne dla wielowymiarowych macierzy. Metoda setAll
, która pobiera lambda, która zwraca wartość przypisaną do położenia tablicy w tym indeksie. Jeśli masz tablicę wielowymiarową, wyższe wymiary są już zainicjowane za pomocą macierzy niższych wymiarów. Nie chcesz przypisać do nich, ale chcesz ukryte zachowanie pętli setAll
.
Mając to na uwadze, można użyć setAll
aby zainicjować tablicę wielowymiarową takiego:
static String[][] testArraySetAll() {
String[][] array = new String[3][3];
Arrays.setAll(array, x -> {
Arrays.setAll(array[x], y -> String.format("%c%c", letter(x), letter(y)));
return array[x];
});
return array;
}
Wewnętrzna setAll
jest dość ładne, ale zewnętrzna jeden musi mieć lambda oświadczenie, że wywołuje wewnętrzną setAll
a następnie zwraca bieżącą tablicę. Nie za ładne.
Nie jest dla mnie jasne, że jedno z tych podejść jest lepsze niż typowe zagnieżdżone pętle for.
Nie strasznie istotne, ale myślę, że oznaczało 'tablica [x] .length' dla pętli wewnętrznej. –
Tak, zdecydowanie zrobiłem –
Wystarczy użyć standardowej pętli for. Twój kod jest prosty i czytelny dla czytelnika. Wygląda tak elegancko, jak rozwiązanie strumieniowe, ale nie widzę, żeby coś tu dodawało. –