Вернуться список из forEach, используя Stream в Java - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь преобразовать приведенный ниже цикл for в метод forEach с помощью функции Stream с использованием Java1.8, но я запутался и тоже растерялся, пытаясь это сделать.

List<A> valueList = new ArrayList<>();
List<B> responseList = getResponses();
List<A> value = new ArrayList<>();

for (B getResponse: responseList) {
    valueList = getValues(getResponse);
    value.addAll(valueList);
}

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

С потоками вы обычно хотите избегать создания пустых списков, а затем добавлять элементы.Потоки должны использовать функциональные идиомы и максимально избегать побочных эффектов.Лучше работать с потоком в целом, а затем «собрать» результаты в конце списка.

List<C> value = getResponses().stream()
    .flatMap(r -> getValues(r).stream())
    .collect(Collectors.toList());
0 голосов
/ 11 декабря 2018

Я пытаюсь преобразовать приведенный ниже цикл for в метод forEach с помощью функции Stream с использованием Java 1.8.

Вы не должны использовать поток вместе с forEach просто для накопленияв предопределенный список, поскольку будут побочные эффекты (которых следует избегать при работе с потоками), лучше используйте потоковый подход, предложенный Джоном Кугельманом, если вы хотите выполнить его с потоками или использовать метод forEach, он также может бытьсделано как:

List<A> value = new ArrayList<>();
responseList.forEach(response -> value.addAll(getValues(response))));
0 голосов
/ 11 декабря 2018

Похоже, вы пытаетесь добавить все значения в responseList к valueList, и я думаю, что вы могли бы просто сделать valueList.addAll(responseList); и вообще не использовать цикл for.

Вы могли быесть проблема, если тип B не наследуется от A, потому что у вас не может быть списка двух несвязанных типов.

...