Вы можете использовать простой групповой сборщик в потоке:
Map<String, List<String>> optionMap = data.stream()
.collect(Collectors.groupingBy(Data::getName,
Collectors.mapping(Data::getOption, Collectors.toList())));
При тестировании с вашим тестовым списком приведенный выше вывод выдаст:
{d1=[option1, option2], d2=[option1], d3=[option1, option2, option3]}
Выше похоже наЛучшая, безопасная альтернатива вашей карте.Кроме того, он позволяет избежать ненужного дублирования.
Ваша окончательная карта, тем не менее, может быть рассчитана на основе вышеизложенного:
Map<String, Map<String, Object>> m = new HashMap<>();
optionMap.entrySet().forEach(entry -> {
Map<String, Object> map = new HashMap<>();
map.put("name", entry.getKey());
map.put("options", entry.getValue());
m.put(entry.getKey(), map);
});
Карта m
, приведенная выше, выглядит следующим образом:
{d1={name=d1, options=[option1, option2]},
d2={name=d2, options=[option1]},
d3={name=d3, options=[option1, option2, option3]}}
Это то, что вам нужно, но, похоже, он содержит дублированные данные и менее безопасен для типов, чем простая карта в предыдущем результате.