@infirmitive

Как объединить 2 списка стримом так, чтобы итоговый результат включал в себя одни параметры из первого списка, а другие из второго списка?

Есть 2 списка List.
Первый содержит в себе список элементов с максимальным значением, второй с минимальным (значения парные. не может быть такого, что в одном списке есть элемент, а в другом такого же, но с другими параметрами нет).
Нужно схлопнуть эти списки в один собрав итоговые значения так, чтоб в одном элементе списка отражалась информация из двух склеенных.
Проще говоря, прогнать через стрим эти два списка, Identity задать по ID и в наборе параметров поле High заполнить из первого списка, поле Low из второго.
Подкините идей как такой стрим написать?

P.S. Список из своего типа данных, в котором есть поля ID, High, Low, и т.д. и т.п.
  • Вопрос задан
  • 472 просмотра
Решения вопроса 1
xez
@xez Куратор тега Java
TL Junior Roo
var collectionOfElements = Stream.concat(highs.stream(), lows.stream())
                .collect(Collectors.toMap(MyObject::id, Function.identity(), (o1, o2) -> {
                    return ... // TODO :: merge two objects;
                })).values();


Объединяете два стрима и превращаете в мапу. Там три аргумента возможны: функция для key, для value, и то, что вам нужно, функция объединяющая элементы при совпадении ключей.
Останется у этой мапы отбросить ключи - останется коллекция объединенных значений.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Wan-Derer
Зобанели на Хабре, волки́ ;((
М.б. так?
import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

public class test {

  public static void main(String[] args) {
    List<Item> listA = new ArrayList<>();
    List<Item> listB = new ArrayList<>();

    List<Item> coupled = couple(listA, listB);

  }

  static List<Item> couple(List<Item> listA, List<Item> listB){
    return listA.stream()
      .peek(itemA -> {
        Item complimentary = listB.stream().filter(itemB -> itemB.getId() == itemA.getId()).findFirst().orElse(null);
        if (complimentary == null) throw new IllegalArgumentException("Can't find pair");
        itemA.setLow(complimentary.getLow());
      })
      .toList();
  }
}


@Getter
@Setter
class Item{
  private int id;
  private int low;
  private int high;
}


НО! Если элементов много то быстродействие будет ни к чёрту :)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы