SQL присоединение к списку групп - PullRequest
0 голосов
/ 02 февраля 2020

У меня есть пара списков, которые я хочу сгруппировать, если данное поле, представляющее то же самое, равно, и мне было интересно, есть ли способ сделать это в лямбдах или потоках

Предположим, у нас есть список с информацией о контейнере

container1-> containerInfo
container2-> containerInfo

Затем у нас есть другой список, который представляет элементы в контейнере и имя контейнера

element1 -> container1 + elementInfo
element2 -> container1 + elementInfo
element3 -> container2 + elementInfo
element4 -> container2 + elementInfo

Существует способ, которым я могу присоединиться с помощью компонента как список, учитывая условия, что оба класса разные, а также мне нужна определенная информация из обоих списков, в конце я хочу иметь что-то вроде этого

Map<Integer,List<ContainetElementMap>> map;

Например:

{containerId, {containerName,elements,extraInfo}}
{containerId, {containerName,elements,extraInfo}}

Я знаю, что есть groupBy, и это может помочь, но он работает, только если оба объекта имеют одинаковый тип, мне нужно что-то вроде, когда sql выполняет соединение между таблицами

1 Ответ

0 голосов
/ 02 февраля 2020

Попробуйте этот подход. Я использовал набор вместо списка и другую точку, вам нужно отфильтровать значения без элемента из карты:

Map<Integer, Set<Elem>> m = containers.stream()
            .collect(
                    Collectors.groupingBy(
                        Container::getId,
                        Collectors.flatMapping(
                                container -> elems.stream().filter(elem -> elem.containerId == container.id),
                                Collectors.toSet())
                 )
    );

Это класс контейнера:

class Container {
    Integer id;

    public Container(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }
}

И элемент:

class Elem {
    Integer id;
    Integer containerId;
    String name;

    public Elem(Integer id, Integer containerId, String name) {
        this.id = id;
        this.containerId = containerId;
        this.name = name;
    }
 }
...