Bunu yapmanın birkaç yolu vardır.
bir yolu satır ve sütun indeksleri üzerinden IntStreams
yuvalanmış bir çift ile geçerli:
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;
}
umut verici görünüyor başka yolu da akışlarının yerine Array.setAll
kullanmaktır. Bu, tek boyutlu bir dizi için değerler oluşturmak için mükemmeldir: dizi dizininden dizide atanmasını istediğiniz değere eşlenen bir işlev sağlarsınız. Örneğin, bunu yapabilirsiniz: Bu, çok boyutlu diziler için daha az uygun olduğu için maalesef daha uygundur. Bu dizinde dizi konumuna atanan bir değer döndüren bir lambda alan setAll
yöntemi. Çok boyutlu bir dizi oluşturduysanız, daha yüksek boyutlar daha düşük boyutlu dizilerle zaten başlatılır. Onlara atamak istemezsiniz, ancak setAll
'un örtük döngü davranışını istiyorsunuz. Bu düşünceyle
, böyle çok boyutlu diziyi başlatmak için
setAll
kullanabilirsiniz:
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;
}
iç setAll
makul güzel, ama dış bir iç setAll
çağıran bir açıklama lambda olması gerekiyor ve sonra geçerli diziyi döndürür. Çok hoş değil.
Bu yaklaşımlardan herhangi birinin, tipik iç içe geçmiş döngülerden daha iyi olduğu açık değildir.
Değil alakalı, ama iç döngü için 'dizi [x] .length' geliyordu düşünüyorum. –
Evet Kesinlikle –
yaptım Sadece standart bir döngü kullanın. Kodunuz okuyucuya basit ve açık bir şekilde açıktır. Bir akarsu çözümü kadar zarif göründüğü gibi, burada bir şey eklemediğini görmüyorum. –