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;
}
Разобьем этот пример на этапы:
- Во-первых, мы создаем объект
Properties
для хранения всех наших объединенных свойств . - Затем мы перебираем объекты
свойств
, которые собираемся объединить . - Затем мы вызываем метод
stringPropertyNames()
, чтобы получить набор имен свойств. - Затем мы перебираем все имена свойств и получаем значение свойства для каждого имени.
- Наконец, мы устанавливаем значение свойства в переменную, созданную на шаге 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 .