Перейти к основному содержимому

Объединение объектов java.util.Properties

· 4 мин. чтения

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. Во-первых, мы создаем объект Properties для хранения всех наших объединенных свойств .
  2. Затем мы перебираем объекты свойств , которые собираемся объединить .
  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 . Точно так же мы затем перебираем объекты свойств , которые собираемся объединить, но на этот раз мы добавляем каждый объект свойств в переменную 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. Заключение

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

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