Суммирование элементов в строке двухмерного массива byte[][]
Задание: написать метод sumRow, который принимает два параметра: двухмерный массив int[][] и int. Метод дожен возвращать сумму всех элементов в строке массива, заданной во втором параметре, и должен возвращать 0, если номер строки некорректен.
Написал код с использованием Stream.
Вопрос: как реализовать всё то же самое для двухмерного массива байт byte[][]? На сколько я знаю, Stream не работает с byte.
public static void main(String[] args) {
int[][] table = new int[4][5];
// заполняем массив
table = Arrays.stream(table)
.map(row -> Arrays.stream(row)
.map(cell -> (int) (1 + Math.random() * 9))
.toArray())
.toArray(int[][]::new);
// тест
sumRowTest(table);
}
public static int sumRow(int[][] table, int row) {
if (row < 0 || row > table.length - 1) return 0;
return Arrays.stream(table[row]).sum();
}
public static void sumRowTest(int[][] table) {
Arrays.stream(table).map(Arrays::toString).forEach(System.out::println);
// [2, 1, 9, 5, 8]
// [5, 6, 7, 7, 3]
// [2, 2, 7, 1, 9]
// [4, 8, 5, 3, 3]
IntStream.rangeClosed(0, table.length)
.mapToObj(i -> "sumRow:" + i + "=" + sumRow(table, i))
.forEach(System.out::println);
// sumRow:0=25
// sumRow:1=28
// sumRow:2=21
// sumRow:3=23
// sumRow:4=0
}
Ответы (1 шт):
Если стоит задача использовать Stream на byte[] (т.е. на строке двумерного массива) с вызовом sum(), то можно использовать Stream на индексе:
public class Main {
public static void main(String[] args) {
byte[] arr = { 127, 127, 0, -1 };
int sum = IntStream.range(0, arr.length).map(i -> arr[i]).sum();
System.out.println(sum);
}
}
Но особенность в том, что суммирование идёт на int, т.е. переполнение иначе работает, чем сумма строго на byte. Этот пример выдаёт 253, тогда как сумма строго на byte будет -3. Но, понятно, от int результата можно перейти к byte при помощи кастинга: System.out.println((byte)sum);