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.
1 2 | 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:
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | 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.
1 2 | 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. |