У меня есть следующая карта: Map<String, Set<String>>
, которую мне нужно инициализировать. Это само по себе не проблема. Тем не менее, поскольку я хочу, чтобы Set
сохранял порядок вставки, я подумал об инициализации всей конструкции с помощью new LinkedHashMap<String, LinkedHashSet<String>>();
, но это вынуждает меня изменить карту на: Map<String, LinkedHashSet<String>>
.
Почему я не могу использовать интерфейс, если при инициализации указываю определенный тип? Или как лучше обеспечить реализацию вложенного типа?
Чтобы понять, почему я хочу это сделать, вот код:
private void sortMap(Map<String, Map<Date, Map<String, Long>>> dataMap) {
Map<String, Set<String>> sortedNames = new LinkedHashMap<String, Set<String>>(); // <-- this initialization
for (Map.Entry<String, Map<Date, Map<String, Long>>> entry : dataMap.entrySet()) {
sortedNames.put(entry.getKey(), entry.getValue().get(getCurrentMonthDate()).keySet());
}
}
EDIT
С помощью принятого ответа я придумал это решение, которое, кажется, прекрасно работает для меня:
Map<String, Set<String>> sortedNames = dataMap.entrySet().stream()
.map(e -> new AbstractMap.SimpleEntry<String, LinkedHashSet<String>>(e.getKey(),
e.getValue().get(getCurrentMonthDate()).keySet().stream()
.collect(Collectors.toCollection(LinkedHashSet<String>::new))))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue));