Search code examples
javajava-8vavr

Javaslang - running a method in Pattern Matcher


I'm trying to incorporate javaslang's pattern matching in a classic factory pattern:

public void log(String message, Integer level) {
        Match(level).of(
                Case($(INFO), run(() -> logger.info(message))), //
                Case($(DEBUG), run(() -> logger.debug(message))), //
                Case($(WARNING), run(() -> logger.warn(message))), //
                Case($(ERROR), run(() -> logger.error(message))), //
                Case($(), run(() -> logger.info(message)))); 
}

Yet this spills and all the methods are run (I get four identical calls to different levels of the logger).


Solution

  • You should not actually call run, you need some lazy evaluation. As i do not see a reason to call run at all, i just removed. This should work.

    Edit: added run to provide an inferable return value.

    public void log(String message, Integer level) {
            Match(level).of(
                    Case($(INFO), l -> run( () -> logger.info(message))), //
                    Case($(DEBUG), l -> run( () -> logger.debug(message))), //
                    Case($(WARNING), l -> run( () -> logger.warn(message))), //
                    Case($(ERROR), l -> run( () -> logger.error(message))), //
                    Case($(), l -> run( () -> logger.info(message)))); 
    }