Слияние объектов java.util.Properties

Слияние объектов java.util.Properties

1. Вступление

В этом коротком руководствеwe’ll focus on how to merge two or more Java Properties objects into one.

Мы рассмотрим три решения, сначала начнем с примера, использующего итерацию. Далее мы рассмотрим использование методаputAll() и в завершение учебника рассмотрим более современный подход с использованием Java 8 Streams.

Чтобы узнать, как начать работу с Java Properties, ознакомьтесь с нашимintroductory article.

2. Краткий обзор использования свойств

Давайте начнем с напоминания о некоторых ключевых понятиях свойств.

We typically use properties in our applications to define configuration values. В Java мы представляем эти значения с помощью простых пар ключ / значение. Кроме того, ключ и значение являются значениямиString в каждой из этих пар.

Обычно мы используем классjava.util.Properties для представления этих пар значений и управления ими. It is important to note that this class inherits from Hashtable.

Чтобы узнать больше о структуре данныхHashtable, прочтите нашIntroduction to Java.util.Hashtable.

2.1. Настройка свойств

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

private Properties propertiesA() {
    Properties properties = new Properties();
    properties.setProperty("application.name", "my-app");
    properties.setProperty("application.version", "1.0");
    return properties;
}

В приведенном выше примере мы создаем объектProperties и используем методsetProperty() для установки двух свойств. Внутренне это вызывает методput() из классаHashtable, но гарантирует, что объекты являются значениямиString.

Обратите внимание: категорически не рекомендуется использовать методput() напрямую, поскольку он позволяет вызывающей стороне вставлять записи, ключи или значения которых не являютсяStrings.

3. Объединение свойств с использованием итераций

Теперь давайте посмотрим, как мы можем объединить два или более объекта свойств с помощью итерации:

private Properties mergePropertiesByIteratingKeySet(Properties... properties) {
    Properties mergedProperties = new Properties();
    for (Properties property : properties) {
        Set propertyNames = property.stringPropertyNames();
        for (String name : propertyNames) {
            String propertyValue = property.getProperty(name);
            mergedProperties.setProperty(name, propertyValue);
        }
    }
    return mergedProperties;
}

Давайте разберем этот пример на шаги:

  1. Сначала мы создаем объектProperties для хранения всех наших объединенных свойств.

  2. Затем мы перебираем объектыProperties, которые собираемся объединить.

  3. Затем мы вызываем методstringPropertyNames() , чтобы получить набор имен свойств.

  4. Затем мы перебираем все имена свойств и получаем значение свойства для каждого имени.

  5. Наконец, мы устанавливаем значение свойства в переменную, которую мы создали на шаге 1

4. Использование методаputAll()

Теперь мы рассмотрим другое распространенное решение для объединения свойств с использованием методаputAll():

private Properties mergePropertiesByUsingPutAll(Properties... properties) {
    Properties mergedProperties = new Properties();
    for (Properties property : properties) {
        mergedProperties.putAll(property);
    }
    return mergedProperties;
}

В нашем втором примере мы снова сначала создаем объектProperties для хранения всех наших объединенных свойств с именемmergedProperties. Аналогичным образом мы затем перебираем объектыProperties, которые собираемся объединить, но на этот раз мы добавляем каждый объектProperties к переменнойmergedProperties  с помощью методаputAll().

МетодputAll() - это еще один метод, унаследованный отHashtable. This method allows us to copy all of the mappings from the specified Properties into our new Properties object.

Стоит отметить, что использованиеputAll() w с любым типомMap  также не рекомендуется, так как мы можем получить записи, ключи или значения которых не являютсяStrings

5. Слияние свойств с Stream API

Наконец, мы рассмотрим, как использовать Stream API для объединения более одного объектаProperties:

private Properties mergePropertiesByUsingStreamApi(Properties... properties) {
    return Stream.of(properties)
        .collect(Properties::new, Map::putAll, Map::putAll);
}

В нашем последнем примере мы создаемStream  из нашего списка свойств, а затем используем методcollect , чтобы сократить последовательность значений в потоке до новогоCollection. The first argument is a Supplier function used to create a new result container which in our case is a new Properties object.

Stream API был представлен в Java 8, у нас есть руководство поgetting started с этим API.

6. Заключение

В этом кратком руководстве мы рассмотрели три различных подхода к объединению двух или более объектовProperties.

Как всегда, примеры доступны в нашихGitHub repository.