class CoverageService {

    int[] computeValues(Collection<Functionality> functionalities, List<AxisDTO> axes, List<AxisGenerator> axisGenerators) {
        int[] values = new int[axes.stream().mapToInt(axis -> axis.getPoints().size()).reduce(1, Math::multiplyExact)];

        for (Functionality functionality : functionalities) {
            List<String[]> functionalityValuePoints = new ArrayList<>();
            for (AxisGenerator axisGenerator : axisGenerators) {
                functionalityValuePoints.add(axisGenerator.getValuePoints(functionality));
            }
            incrementValueForFunctionalityProperties(values, functionalityValuePoints, axes);
        }

        return values;
    }

}