2

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

fbielejec
  • 3,492
  • 4
  • 27
  • 35

1 Answers1

2

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)))); 
}
k5_
  • 5,450
  • 2
  • 19
  • 27
  • this gives a compilation error "Cannot infer type argument(s) for of(API.Match.Case extends T,? extends R>[]" and "Cannot return a void result". – fbielejec Apr 10 '17 at 21:04
  • 1
    @fbielejec i made an adjustment, maybe it works now. – k5_ Apr 10 '17 at 21:10