Автор оригинала: Jonathan Cook.
1. введение
В этом коротком уроке мы сосредоточимся на том, как объединить два или более объектов Java Properties в один.
Мы рассмотрим три решения, сначала начав с примера с использованием итерации. Далее мы рассмотрим использование метода putAll() и в заключение урока рассмотрим более современный подход с использованием потоков Java 8.
Чтобы узнать, как начать работу со свойствами Java, ознакомьтесь с нашей вводной статьей .
2. Краткий обзор использования свойств
Давайте начнем с напоминания о некоторых ключевых понятиях свойств.
Мы обычно используем свойства в наших приложениях для определения значений конфигурации . В Java мы представляем эти значения с помощью простых пар ключ/значение. Кроме того, ключ и значение являются значениями String в каждой из этих пар.
Обычно мы используем java.util.Свойства класс для представления и управления этими парами значений. Важно отметить, что этот класс наследуется от Hashtable .
Чтобы узнать больше о структуре данных Hashtable , прочитайте наше Введение в Java.util.Хэш-таблица .
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 .
Обратите внимание, что настоятельно не рекомендуется использовать класть() метод непосредственно, поскольку он позволяет вызывающему абоненту вставлять записи, ключи или значения которых не являются Строки .
3. Объединение Свойств С Помощью Итерации
Теперь давайте посмотрим, как мы можем объединить два или более объектов свойств с помощью итерации:
private Properties mergePropertiesByIteratingKeySet(Properties... properties) { Properties mergedProperties = new Properties(); for (Properties property : properties) { SetpropertyNames = property.stringPropertyNames(); for (String name : propertyNames) { String propertyValue = property.getProperty(name); mergedProperties.setProperty(name, propertyValue); } } return mergedProperties; }
Давайте разберем этот пример на этапы:
- Во-первых, мы создаем объект Properties для хранения всех наших объединенных свойств
- Затем мы зациклимся на Свойствах объектах, которые мы собираемся объединить
- Затем мы вызываем метод string propertyNames () , чтобы получить набор имен свойств
- Затем мы перебираем все имена свойств и получаем значение свойства для каждого имени
- Наконец, мы устанавливаем значение свойства в переменную, созданную на шаге 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 . Этот метод позволяет нам скопировать все сопоставления из указанных Свойств в наш новый Свойства объект.
Стоит отметить, что использование pitfall() с любым видом Map также не рекомендуется, так как мы можем получить записи, ключи или значения которых не являются строками
5. Объединение Свойств С API потока
Наконец, мы рассмотрим, как использовать API потока для объединения нескольких объектов Properties :
private Properties mergePropertiesByUsingStreamApi(Properties... properties) { return Stream.of(properties) .collect(Properties::new, Map::putAll, Map::putAll); }
В нашем последнем примере мы создаем Поток из нашего списка свойств, а затем используем метод collect , чтобы уменьшить последовательность значений в потоке до новой Коллекции . Первым аргументом является функция Supplier , используемая для создания нового контейнера результатов, который в нашем случае является новым объектом Properties .
Потоковый API был представлен в Java 8, у нас есть руководство по началу работы с этим API.
6. Заключение
В этом кратком руководстве мы рассмотрели три различных способа объединения двух или более объектов Properties .
Как всегда, примеры доступны в нашем репозитории GitHub .