Fusion des objets java.util.Properties

Fusion d'objets java.util.Properties

1. introduction

Dans ce court didacticiel,we’ll focus on how to merge two or more Java Properties objects into one.

Nous allons explorer trois solutions, en commençant par un exemple utilisant l'itération. Ensuite, nous examinerons l'utilisation de la méthodeputAll() et pour conclure le didacticiel, nous examinerons une approche plus moderne utilisant Java 8 Streams.

Pour savoir comment démarrer avec les propriétés Java, consultez nosintroductory article.

2. Récapitulatif rapide de l'utilisation des propriétés

Commençons par nous rappeler certains des concepts clés des propriétés.

We typically use properties in our applications to define configuration values. En Java, nous représentons ces valeurs à l'aide de simples paires clé / valeur. De plus, la clé et la valeur sont toutes les deux des valeursString dans chacune de ces paires.

Normalement, nous utilisons la classejava.util.Properties pour représenter et gérer ces paires de valeurs. It is important to note that this class inherits from Hashtable.

Pour en savoir plus sur la structure de données deHashtable, lisez nosIntroduction to Java.util.Hashtable.

2.1. Configurer les propriétés

Pour simplifier les choses, nous allons configurer les propriétés par programmation pour nos exemples:

private Properties propertiesA() {
    Properties properties = new Properties();
    properties.setProperty("application.name", "my-app");
    properties.setProperty("application.version", "1.0");
    return properties;
}

Dans l'exemple ci-dessus, nous créons un objetProperties et utilisons la méthodesetProperty() pour définir deux propriétés. En interne, cela appelle la méthodeput() de la classeHashtable mais garantit que les objets sont des valeursString.

Notez qu'il est fortement déconseillé d'utiliser directement la méthodeput() car elle permet à l'appelant d'insérer des entrées dont les clés ou les valeurs ne sont pasStrings.

3. Fusion de propriétés à l'aide de l'itération

Voyons maintenant comment nous pouvons fusionner deux ou plusieurs objets de propriétés à l'aide de l'itération:

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;
}

Décomposons cet exemple en étapes:

  1. Tout d'abord, nous créons un objetProperties pour contenir toutes nos propriétés fusionnées

  2. Ensuite, nous bouclons sur les objetsProperties que nous allons fusionner

  3. Nous appelons ensuite la méthodestringPropertyNames() pour obtenir un ensemble de noms de propriétés

  4. Ensuite, nous parcourons tous les noms de propriétés et obtenons la valeur de propriété pour chaque nom.

  5. Enfin, nous définissons la valeur de la propriété dans la variable créée à l’étape 1.

4. Utilisation de la méthodeputAll()

Nous allons maintenant examiner une autre solution courante pour fusionner des propriétés à l'aide de la méthodeputAll():

private Properties mergePropertiesByUsingPutAll(Properties... properties) {
    Properties mergedProperties = new Properties();
    for (Properties property : properties) {
        mergedProperties.putAll(property);
    }
    return mergedProperties;
}

Dans notre deuxième exemple, nous créons à nouveau un objetProperties pour contenir toutes nos propriétés fusionnées appeléesmergedProperties. De même, nous parcourons ensuite les objetsProperties que nous allons fusionner mais cette fois nous ajoutons chaque objetProperties à la variablemergedProperties en utilisant la méthodeputAll().

La méthodeputAll() est une autre méthode héritée deHashtable. This method allows us to copy all of the mappings from the specified Properties into our new Properties object.

Il est à noter que l'utilisation deputAll() w avec tout type deMap  est également déconseillée car nous pourrions nous retrouver avec des entrées dont les clés ou les valeurs ne sont pasStrings

5. Fusion de propriétés avec l'API Stream

Enfin, nous verrons comment utiliser l'API Stream pour fusionner plus d'un objetProperties:

private Properties mergePropertiesByUsingStreamApi(Properties... properties) {
    return Stream.of(properties)
        .collect(Properties::new, Map::putAll, Map::putAll);
}

Dans notre dernier exemple, nous créons unStream  à partir de notre liste de propriétés, puis utilisons la méthodecollect pour réduire la séquence de valeurs dans le flux en un nouveauCollection. The first argument is a Supplier function used to create a new result container which in our case is a new Properties object.

L'API Stream a été introduite dans Java 8, nous avons un guide surgetting started avec cette API.

6. Conclusion

Dans ce bref didacticiel, nous avons abordé trois manières différentes d'aborder la fusion de deux ou plusieurs objetsProperties.

Comme toujours, les exemples sont disponibles dans nosGitHub repository.