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

Are you joining the containers revolution? Start leveraging container management using Platform9's ultimate guide to Kubernetes deployment.

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.

Using Containers? Read our Kubernetes Comparison eBook to learn the positives and negatives of Kubernetes, Mesos, Docker Swarm and EC2 Container Services.

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.

THE DZONE NEWSLETTER

Dev Resources & Solutions Straight to Your Inbox

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

X

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

{{ parent.tldr }}

{{ parent.urlSource.name }}