Вы также можете использовать Collectors#groupingBy
для этой цели.Сначала сгруппируйте по полю имени, затем сгруппируйте по id и fieldType.
List<CustomFormAttributeLite> custFormAttrLiteList = new ArrayList<>();
Map<String,Map<Long,Long>> customNameId = custFormAttrLiteList.stream()
.collect(Collectors.groupingBy(CustomFormAttributeLite::getName,
Collectors.toMap(CustomFormAttributeLite::getId, CustomFormAttributeLite::getFieldType)));
Если имена не уникальны, результат не будет таким, как вы ожидаете, поэтому в этом случае нам нужно использовать Collectors.toMap
и используйте mergeFunction
, чтобы сохранить только вторую неуникальную запись:
Map<String,Map<Long,Long>> customNameIdNonUnique = custFormAttrLiteList.stream()
.collect(Collectors.toMap(CustomFormAttributeLite::getName, //key mapper function
(obj) -> {Map<Long,Long> map = new HashMap<>(); map.put(obj.getId(), obj.getFieldType()); return map;}, //value mapper function
(key1, key2)-> key2)); //retaining only the second entry
В качестве теста я использовал следующий набор данных для тестирования обоих этих решений:
CustomFormAttributeLite c1 = new CustomFormAttributeLite("foo", 123L, 123L);
CustomFormAttributeLite c2 = new CustomFormAttributeLite("foo", 124L, 125L);
CustomFormAttributeLite c3 = new CustomFormAttributeLite("bar", 125L, 126L);
CustomFormAttributeLite c4 = new CustomFormAttributeLite("bar", 125L, 126L);
Второе решение дало результат:
{bar={125=126}, foo={124=125}}