«1. Введение

В этом кратком руководстве мы сосредоточимся на том, как объединить два или более объектов свойств Java в один.

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

Чтобы узнать, как начать работу со свойствами Java, ознакомьтесь с нашей вводной статьей.

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

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

Обычно мы используем свойства в наших приложениях для определения значений конфигурации. В Java мы представляем эти значения с помощью простых пар ключ/значение. Кроме того, ключ и значение являются строковыми значениями в каждой из этих пар.

Обычно мы используем класс java.util.Properties для представления и управления этими парами значений. Важно отметить, что этот класс наследуется от Hashtable.

Чтобы узнать больше о структуре данных Hashtable, прочитайте наше введение в 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, но гарантирует, что объекты являются строковыми значениями.

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

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

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

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

Разобьем этот пример на этапы:

  1. First, we create a Properties object to hold all our merged properties
  2. Next, we loop over the Properties objects we are going to merge
  3. We then call the stringPropertyNames() method to get a set of property names
  4. Then we loop through all the property names and get the property value for each name
  5. Finally, we set the property value into the variable we created in step 1

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

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

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

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

Метод putAll() — это еще один метод, унаследованный от Hashtable. Этот метод позволяет нам скопировать все сопоставления из указанных свойств в наш новый объект свойств.

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

5. Объединение свойств с Stream API

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

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

В нашем последнем примере мы создаем Stream из нашего списка свойств, а затем используем метод collect для уменьшения последовательность значений в потоке в новую коллекцию. Первый аргумент — это функция Supplier, используемая для создания нового контейнера результатов, который в нашем случае является новым объектом Properties.

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

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

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

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