Группируйте объекты в списке с помощью Stream API - PullRequest
0 голосов
/ 09 мая 2018

Представьте, что у нас есть класс POJO Item:

class Item {
    private String key;
    private String $value;

    // constructors, getters & setters
}

И в нашем основном классе у нас есть List, содержащий некоторые из этих предметов. Как я могу сгруппировать все элементы с одинаковым key с помощью Stream API?

Я обнаружил, что Collectors.groupingBy - это более или менее то, что я ищу, но он возвращает карту, и мне нужно сохранить порядок элементов List.

Например, представьте, что список выглядит следующим образом:

List [
    Item { key1, value1 },
    Item { key2, value2 },
    Item { key2, value3 }
]

Я ожидал бы возвращаемое значение, подобное (и только подобное), следующее:

List [
    List [
        Item { key1, value1 }
    ], 
    List [
        Item { key2, value2 },
        Item { key2, value3 }
    ]
]

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

List [
    AnotherObject {
        key1,
         List [
            Item { key1, value1 }
        ]
    },

    AnotherObject {
        key2,
         List [
            Item { key2, value2 },
            Item { key2, value3 }
        ]
    }
]

Быть другимОбъектом другого класса POJO:

class AnotherObject {
    private String key;
    private List<Item> $items;

    // constructors, getters & setters
}

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Другим подходом будет использование коллектора toMap:

Collection<AnotherObject> resultSet = items.stream()
            .collect(Collectors.toMap(Item::getKey,
                    f -> new AnotherObject(f.getKey(),
                            new ArrayList<>(Collections.singletonList(f))),
                    (left, right) -> {
                        left.get$items().addAll(right.get$items());
                        return left;
                    }, LinkedHashMap::new)).values();
0 голосов
/ 09 мая 2018

Просто сопоставьте свою запись Карты, возвращенную groupBy, с Вашим AnotherObject.

List<AnotherObject> result = items.stream()
     .collect(Collectors.groupingBy(Item::getKey, LinkedHashMap::new, Collectors.toList()))
     .entrySet()
     .stream()
     .map(e -> new AnotherObject(e.getKey(), e.getValue()))
     .collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...