Я пытаюсь выполнить операцию карты для каждой записи в объекте Map
.
Мне нужно взять префикс с ключа и преобразовать значение из одного типа в другой. Мой код принимает записи конфигурации из Map<String, String>
и преобразование в Map<String, AttributeType>
(AttributeType
- это просто класс, содержащий некоторую информацию. Дальнейшее объяснение не имеет отношения к этому вопросу.)
Лучшее, что я смог придумать с использованием потоков Java 8, следующее:
private Map<String, AttributeType> mapConfig(Map<String, String> input, String prefix) {
int subLength = prefix.length();
return input.entrySet().stream().flatMap((Map.Entry<String, Object> e) -> {
HashMap<String, AttributeType> r = new HashMap<>();
r.put(e.getKey().substring(subLength), AttributeType.GetByName(e.getValue()));
return r.entrySet().stream();
}).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
Невозможно построить Map.Entry
из-за того, что он является интерфейсом, вызывает создание экземпляра единственной записи Map
и использование flatMap()
, что кажется уродливым.
Есть ли лучшая альтернатива? Кажется, лучше сделать это, используя цикл for:
private Map<String, AttributeType> mapConfig(Map<String, String> input, String prefix) {
Map<String, AttributeType> result = new HashMap<>();
int subLength = prefix.length();
for(Map.Entry<String, String> entry : input.entrySet()) {
result.put(entry.getKey().substring(subLength), AttributeType.GetByName( entry.getValue()));
}
return result;
}
Должен ли я избегать Stream API для этого? Или есть ли лучший способ, который я пропустил?