Since Java Properties are typically strings but derived from a Map<Object, Object>
working with them in code is irritating. This example will demonstrate how to convert Properties to Map<String, String>
using core java and guava Maps utility.
Straight up Java
A less than optimal approach is passing properties to the HashMap constructor while ignoring declaring the type. If you are following good programming practice you should declare @SuppressWarnings.
Constructor
@Test
public void create_map_from_properties () {
Properties properties = new Properties();
properties.put("database.username", "yourname");
properties.put("database.password", "encrypted_password");
properties.put("database.driver", "com.mysql.jdbc.Driver");
properties.put("database.url", "jdbc:mysql://localhost:3306/sakila?profileSQL=true");
@SuppressWarnings({ "unchecked", "rawtypes" })
Map<String, String> mapOfProperties = new HashMap(properties);
assertThat(mapOfProperties.keySet(), containsInAnyOrder(
"database.username", "database.password",
"database.driver", "database.url"));
}
While loop
In this snippet, we will use a while loop to iterate and add property values to a Map<String, String>
.
@Test
public void create_map_from_properties_java () {
Properties properties = new Properties();
properties.put("database.username", "yourname");
properties.put("database.password", "encrypted_password");
properties.put("database.driver", "com.mysql.jdbc.Driver");
properties.put("database.url", "jdbc:mysql://localhost:3306/sakila?profileSQL=true");
Map<String, String> mapOfProperties = new HashMap<String, String>();
Enumeration<?> propertyNames = properties.propertyNames();
while (propertyNames.hasMoreElements()) {
String key = (String) propertyNames.nextElement();
mapOfProperties.put(key, properties.getProperty(key));
}
logger.info(mapOfProperties);
assertThat(mapOfProperties.keySet(), containsInAnyOrder(
"database.username", "database.password",
"database.driver", "database.url"));
}
Java 8
This snippet will show how to transform properties to a map using java 8 by first converting the entryset to a stream. Next calling the collect will reduce the stream to a map and the entryset key will be the map key and entry value the map value.
@Test
public void create_map_from_properties_java8() {
Properties properties = new Properties();
properties.put("database.username", "yourname");
properties.put("database.password", "encrypted_password");
properties.put("database.driver", "com.mysql.jdbc.Driver");
properties.put("database.url",
"jdbc:mysql://localhost:3306/sakila?profileSQL=true");
Stream<Entry<Object, Object>> stream = properties.entrySet().stream();
Map<String, String> mapOfProperties = stream.collect(Collectors.toMap(
e -> String.valueOf(e.getKey()),
e -> String.valueOf(e.getValue())));
assertThat(
mapOfProperties.keySet(),
containsInAnyOrder("database.username", "database.password",
"database.driver", "database.url"));
}
Google Guava
Guava Maps, a utility class pertaining to Map instances, contains a connivence method Maps.fromProperties which allows you to get a Map<String, String>
out of Properties.
@Test
public void create_map_from_properties_guava () {
Properties properties = new Properties();
properties.put("database.username", "yourname");
properties.put("database.password", "encrypted_password");
properties.put("database.driver", "com.mysql.jdbc.Driver");
properties.put("database.url", "jdbc:mysql://localhost:3306/something?profileSQL=true");
Map<String, String> mapOfProperties = Maps.fromProperties(properties);
logger.info(mapOfProperties);
assertThat(mapOfProperties.keySet(), containsInAnyOrder(
"database.username", "database.password",
"database.driver", "database.url"));
}