Слияние объектов 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;
}
Давайте разберем этот пример на шаги:
-
Сначала мы создаем объектProperties для хранения всех наших объединенных свойств.
-
Затем мы перебираем объекты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. Аналогичным образом мы затем перебираем объекты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.