#java #list #java-stream
#java #Список #java-stream
Вопрос:
В настоящее время у меня есть список объектов, таких как
List<Foo> fooList = new ArrayList<>();
Где Foo — это:
public class Foo {
public Bar bar;
// getters and setters
}
Теперь с другим List<Bar> barList
я хотел установить каждый Bar
элемент для каждого внутреннего Foo.Bar
элемента fooList
использования потоков Java.
Я пытался сделать это с помощью map
функции with setBar
, но я не могу вызвать «set» внутри map
.
Комментарии:
1. Как насчет
barList.forEach(b -> fooList.forEach(f -> f.setBar(b)));
2. К сожалению, это связано с избыточным циклом и ненужными наборами. Для
n
элементов в каждом списке вы делаете общее количество(n*n) sets
, когда все, что вам нужно, этоn
наборы. Это вложенный цикл.3. Я не знаю, почему голоса down. Это потому, что я потратил один день, чтобы предоставить отзыв об ответах?
Ответ №1:
Вы можете сделать это следующим образом. Он возвращает новый список измененных Foo
объектов. Оригинал также изменен. Я мог бы использовать peek для вызова изменения, но использование peek
таким образом считается плохой практикой.
IntStream.range(0, fooList.size()).mapToObj(i -> {
fooList.get(i).setBar(barList.get(i));
return fooList.get(i);})
.collect(Collectors.toList());
Я бы не использовал для этого потоки, а простой цикл for . Например,
for (int i = 0; i < fooList.size(); i ) {
fooList.get(i).setBar(barList.get(i));
}
или с расширенным forloop и локальным индексом.
int i = 0;
for (Foo f : fooList) {
f.setBar(barList.get(i ));
}
Эти решения предполагают, что существует взаимно однозначное упорядоченное сопоставление fooList
элементов barList
элементам.
Комментарии:
1. Спасибо! Чем проще, тем лучше. Ваш ответ указал мне правильный путь. Приветствия!