Рубрики
Без рубрики

Как обычно, полный код этой статьи доступен || на GitHub || .

Краткое и практическое руководство по объединению объектов свойств.

Автор оригинала: 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) {
        Set propertyNames = property.stringPropertyNames();
        for (String name : propertyNames) {
            String propertyValue = property.getProperty(name);
            mergedProperties.setProperty(name, propertyValue);
        }
    }
    return mergedProperties;
}

Давайте разберем этот пример на этапы:

  1. Во-первых, мы создаем объект Properties для хранения всех наших объединенных свойств
  2. Затем мы зациклимся на Свойствах объектах, которые мы собираемся объединить
  3. Затем мы вызываем метод string propertyNames () , чтобы получить набор имен свойств
  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 . Аналогично, затем мы перебираем объекты 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 .