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).
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))));
}