Mesclando objetos java.util.Properties
1. Introdução
Neste breve tutorial,we’ll focus on how to merge two or more Java Properties objects into one.
Vamos explorar três soluções, primeiro começando com um exemplo usando iteração. A seguir, veremos como usar o métodoputAll() e para concluir o tutorial, veremos uma abordagem mais moderna usando Java 8 Streams.
Para aprender como começar a usar as propriedades Java, verifique nossointroductory article.
2. Uma rápida recapitulação sobre o uso de propriedades
Vamos começar nos lembrando de alguns dos principais conceitos de propriedades.
We typically use properties in our applications to define configuration values. Em Java, representamos esses valores usando pares simples de chave / valor. Além disso, a chave e o valor são valoresString em cada um desses pares.
Normalmente usamos a classejava.util.Properties para representar e gerenciar esses pares de valores. It is important to note that this class inherits from Hashtable.
Para saber mais sobre a estrutura de dadosHashtable, leia nossoIntroduction to Java.util.Hashtable.
2.1. Configurando Propriedades
Para manter as coisas simples, vamos configurar as propriedades de forma programática para nossos exemplos:
private Properties propertiesA() {
Properties properties = new Properties();
properties.setProperty("application.name", "my-app");
properties.setProperty("application.version", "1.0");
return properties;
}
No exemplo acima, criamos um objetoProperties e usamos o métodosetProperty() para definir duas propriedades. Internamente, isso chama o métodoput() da classeHashtable, mas garante que os objetos sejam valoresString.
Observe que não é recomendável usar o métodoput() diretamente, pois ele permite que o chamador insira entradas cujas chaves ou valores não sejamStrings.
3. Mesclando propriedades usando iteração
Agora vamos ver como podemos mesclar dois ou mais objetos de propriedades usando iteração:
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;
}
Vamos dividir este exemplo em etapas:
-
Primeiro, criamos um objetoProperties para manter todas as nossas propriedades mescladas
-
Em seguida, fazemos um loop sobre os objetosProperties que vamos fundir
-
Em seguida, chamamos o métodostringPropertyNames() para obter um conjunto de nomes de propriedades
-
Em seguida, percorremos todos os nomes de propriedades e obtemos o valor da propriedade para cada nome
-
Por fim, definimos o valor da propriedade na variável que criamos na etapa 1
4. Usando o métodoputAll()
Agora veremos outra solução comum para mesclar propriedades usando o métodoputAll():
private Properties mergePropertiesByUsingPutAll(Properties... properties) {
Properties mergedProperties = new Properties();
for (Properties property : properties) {
mergedProperties.putAll(property);
}
return mergedProperties;
}
Em nosso segundo exemplo, novamente primeiro criamos um objetoProperties para conter todas as nossas propriedades mescladas chamadasmergedProperties. Da mesma forma, iteramos através dos objetosProperties que iremos fundir, mas desta vez adicionamos cada objetoProperties à variávelmergedProperties usando o métodoputAll().
O métodoputAll() é outro método herdado deHashtable. This method allows us to copy all of the mappings from the specified Properties into our new Properties object.
Vale a pena mencionar que o uso deputAll() com qualquer tipo deMap também é desencorajado, pois podemos acabar com entradas cujas chaves ou valores não sãoStrings
5. Mesclando propriedades com a API Stream
Por fim, veremos como usar a API Stream para mesclar mais de um objetoProperties:
private Properties mergePropertiesByUsingStreamApi(Properties... properties) {
return Stream.of(properties)
.collect(Properties::new, Map::putAll, Map::putAll);
}
Em nosso último exemplo, criamos umStream a partir de nossa lista de propriedades e, em seguida, usamos o métodocollect para reduzir a sequência de valores no fluxo em um novoCollection. The first argument is a Supplier function used to create a new result container which in our case is a new Properties object.
A API Stream foi introduzida no Java 8, temos um guia emgetting started com esta API.
6. Conclusão
Neste breve tutorial, cobrimos três maneiras diferentes de abordar a fusão de dois ou mais objetosProperties.
Como sempre, os exemplos estão disponíveis em nossoGitHub repository.