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 шт):
Во вложенном стриме используется терминальная операция 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)
);
}