Core Java
Converting string configuration properties to other types, with a bit of Optional
Somedays you come across some code and think that’s pretty, why didn’t I think of that? So my long time colleague Mark Warner has a nice twist on the standard name/value store pattern using method references to deal with converting from a String.
int size = store.getProperty("cache.limit", 500, Integer::parseInt);
boolean enabled = store.getProperty("cache.enabled", true, Boolean::getBoolean);I took his example and refactored it slightly to return Optional, and I ended up with the following:
public Optional<String> getProperty(
String propertyName) {
return Optional.ofNullable(map.get(propertyName));
}
public <T> Optional<T> getProperty(
String propertyName,
ThrowingFunction<String,? extends T,? extends Exception> func ) {
return getProperty(propertyName).map(val -> {
try {
return func.apply( val );
} catch ( Exception e ) {
LOGGER.severe( () -> "Invalid property transform, will default " + e.getMessage() );
return null;
}
});
}This means that the default value ends up being provided by the Optional which is a nice application of OAOO.
int size = store.getProperty("cache.limit", Integer::parseInt).orElse(500);
boolean enabled = store.getProperty("cache.enabled", Boolean::getBoolean).orElse(true);I think this is even tidier; but it does depend on who you feel about using Optionals.
| Reference: | Converting string configuration properties to other types, with a bit of Optional from our JCG partner Gerard Davison at the Gerard Davison’s blog blog. |

