Over a million developers have joined DZone.
{{announcement.body}}
{{announcement.title}}

Java 8 Configuration Defaults Using Optional

DZone's Guide to

Java 8 Configuration Defaults Using Optional

In pursuit of more fluent code, this article looks into handling string conversions of configuration data using Java 8's Optional.

· Java Zone
Free Resource

Download Microservices for Java Developers: A hands-on introduction to frameworks and containers. Brought to you in partnership with Red Hat.

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 how you feel about using Optional.

Download Building Reactive Microservices in Java: Asynchronous and Event-Based Application Design. Brought to you in partnership with Red Hat

Topics:
java ,optional

Published at DZone with permission of Gerard Davison, DZone MVB. See the original article here.

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}