Потоки Java устанавливают каждый атрибут списка объектов другим списком

#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. Спасибо! Чем проще, тем лучше. Ваш ответ указал мне правильный путь. Приветствия!