Как работает функция computeIfAbsent в Java
Помогите разобраться со следующим кодом на Java:
private void loadYamlMatcher(MappingNode entry, String filename) {
List<MappingNode> matcherConfigList = matcherConfigs
.computeIfAbsent(filename, k -> new ArrayList<>(32));
matcherConfigList.add(entry);
}
В данном случаи в filename передаются последовательно следующие названия файлов:
Amazon
AmazonDevices
Android
AndroidDeviceOverrides
Anonymized
Apple
И в matcherConfigs они записываются в следующем порядке
Apple
Android
Anonymized
Amazon
AmazonDevices
AndroidDeviceOverrides
Вопрос заключатеся в том, почему теряется сортировка по алфавиту?
Ответы (1 шт):
Метод computeIfAbsent возвращает или значение из отображения по ключу, или создает его, если его не было. Это аналог getOrDefault с разницей, который принимает функцию (например лямбду) и возвращает ее результат, а если ключа не было, то добавит
Пример:
Map<String, List<String>> config = new HashMap<>();
System.out.println(config.get("abc"));
// null
System.out.println(config.getOrDefault("abc", Arrays.asList("test", "log")));
System.out.println(config);
// [test, log]
// {}
System.out.println(config.computeIfAbsent("abc", k -> Arrays.asList("test", "log")));
System.out.println(config);
// [test, log]
// {abc=[test, log]}
А порядок у вас не такой из-за особенности реализации HashMap - он хранит не ключи, а их хэши, поэтому порядок не гарантируется
Для сохранения порядка ключей по их добавлению используйте LinkedHashMap