Q:

Помогите функцию перевести в stream api

Есть матрица: 
List<ArrayList<Double>> matr;

требуется в матрице найти среднее значение, без стримов я это делаю так:
 public Double averageMatr() {
        Double sum=0.0;
        for (ArrayList<Double> list : matr) {
            for (Double item : list) {
                sum+=item;
            }

        }
        return sum/matr.size()*countColumn;
    }

Подскажите как можно этот цикл записать в стримах?
Пытался сделать вот так:
public Double averageMatr() {
        Double sum=0.0;
        for (ArrayList<Double> list : matr) {
           sum+= list.stream().mapToDouble(Double::doubleValue).average().getAsDouble();
        }
        return sum/matr.size();
    }

Но так получается неверный результат. со строк находится среднее значение, и дальше берется среднее значение из средних значений. То есть неверно.

A:

Это делается очень просто с помощью метода Stream.flatMap:
matr.stream().flatMap(Collection::stream).mapToDouble(d -> d).average()

