Как работает функция 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 шт):

Автор решения: gil9red

Метод 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

→ Ссылка