Преобразование файла (YAML) в любую реализацию MAP - PullRequest
0 голосов
/ 14 января 2019

Я работал над проектом свободного времени, где мне нужно было прочитать значения из файла YAML и сохранить их в HashMap, другой файл YAML должен был быть сохранен в LinkedHashMap. Для чтения я использовал API, в приведенном ниже коде было добавлено некоторое объяснение (хотя я считаю, что оно довольно избыточно). Был включен только метод, который возвращает LinkedHashMap, потому что другой практически идентичен.

В настоящее время я использую отдельные методы для получения HashMap и LinkedHashMap, но заметил, что код был довольно похож. Поэтому я задался вопросом, можно ли написать общий метод, который помещает пути и значения из файла YAML в любую реализацию Collections (которая реализует Hash Table)? И если да, то как этого добиться?

public LinkedHashMap<String, Object> fileToLinkedHashMap(File yamlFile)
{
    LinkedHashMap<String, Object> fileContents = new LinkedHashMap<String, Object>();

    //Part of the API I'm using, reads from YAML File and stores the contents
    YamlConfiguration config = YamlConfiguration.loadConfiguration(yamlFile);

    //Configuration#getKeys(true) Gets all paths within the read File
    for (String path : config.getKeys(true))
    {
        //Gets the value of a path
        if (config.get(path) != null)
            fileContents.put(path, config.get(path));
    }

    return fileContents;
}

Примечание: я знаю, что в настоящее время я не проверяю, является ли данный файл файлом YAML, это избыточно в этом вопросе.

1 Ответ

0 голосов
/ 14 января 2019

Вы можете использовать функциональные интерфейсы (представленные в Java 8) для этого:

public void consumeFile(File yamlFile, BiConsumer<? super String, ? super Object> consumer){
    YamlConfiguration config = YamlConfiguration.loadConfiguration(yamlFile);
    for (String path : config.getKeys(true)){
        if (config.get(path) != null){
            consumer.accept(path, config.get(path));
        }
    }
}

Который затем можно вызывать буквально с чем угодно, вам просто нужно указать лямбду, которая принимает 2 параметра:

// collect into a map
Map<String, Object> map = /* hash map, linked hash map, tree map, you decide */;
consumeFile(yamlFile, map::put);

// just print them, why not?
consumeFile(yamlFile, (key, value) -> System.out.println(key + " = " + value));

Видите ли, использование возможно бесконечно. Ограничено только вашим вариантом использования и воображением.

Если вы не можете использовать Java 8 (хотя, вероятно, вам следует), надежда есть. Поскольку вы оба раза возвращаете Map, при вызове метода вы можете решить, в какую реализацию карты вы хотите собрать:

public Map<String, Object> consumeFile(File yamlFile, Map<String, Object> map){
    YamlConfiguration config = YamlConfiguration.loadConfiguration(yamlFile);
    for (String path : config.getKeys(true)){
        if (config.get(path) != null){
            map.put(path, config.get(path));
        }
    }
    return map;
}

Что можно назвать так:

Map<String, Object> map = consumeFile(yamlFile, new /*Linked*/HashMap<>());

Опять же, какую реализацию карт вы хотите использовать, вы можете решить для своих нужд.

...