Bad return type in lambda expression: void cannot be converted to IntStream

хочу переложить циклы for на stream api. С обычным циклом все хорошо, никаких проблем не возникло, но когда взялся переделывать вложенный возникла ошибка Bad return type in lambda expression: void cannot be converted to IntStream.

Сам метод:

public void createAnswerSuccess() throws Exception {
        File fileAnswer = new File(Constants.ANSWER_PROPERTIES_CONST);
        Properties propertiesAnswer = new Properties();
        propertiesAnswer.load(new FileReader(fileAnswer));
        log.info("createAnswerSuccess");
        DataProviderXML instance = new DataProviderXML();
        IntStream.range(1,3).flatMap(
                i -> IntStream.range(1,4).forEach(j ->{
                    try {
                        assertTrue(instance.createAnswer(propertiesAnswer.getProperty(Constants.ANSWER_CONST + i + "_" + j) , Integer.parseInt(propertiesAnswer.getProperty(Constants.WEIGHT_CONST+j))));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }));
    }

Ответы (1 шт):

Автор решения: Nowhere Man

Во вложенном стриме используется терминальная операция Stream::forEach, которая имеет тип возврата void, и следовательно к ней не имеет смысла применять flatMap, о чём и сообщает ошибка.

Вероятно, следовало получить стрим булевых значений из ответов, созданных провайдером (используется IntStream::mapToObj во внешнем стриме и IntStream::allMatch во вложенном), проверить, что все они являются true при помощи Stream::allMatch, и уже результат проверки передать как аргумент в assertTrue. Также следует использовать более короткие и осмысленные названия переменных.

Вариант решения:

public void createAnswerSuccess() throws Exception {
    File fileAnswer = new File(Constants.ANSWER_PROPERTIES_CONST);
    Properties answers = new Properties();
    answers.load(new FileReader(fileAnswer));

    log.info("createAnswerSuccess");
    DataProviderXML provider = new DataProviderXML();

    assertTrue(IntStream.range(1, 3)
        .mapToObj(i -> IntStream.range(1, 4)
            .allMatch(j -> provider.createAnswer(
                answers.getProperty(Constants.ANSWER_CONST + i + "_" + j),
                Integer.parseInt(answers.getProperty(Constants.WEIGHT_CONST + j))
            ))
        ) // Stream<Boolean>
        .allMatch(Boolean.TRUE::equals)
    );
}
→ Ссылка