Sfl4j和java 8:此表达式的目标类型必须是函数接口

Sfl4j和java 8:此表达式的目标类型必须是函数接口,java,java-8,slf4j,Java,Java 8,Slf4j,我有一个非常昂贵的操作来生成调试消息,我希望避免每次生成调试消息 所以我用这个: log.debug("{}", () -> expensive()); //gives the target type must be a functional interface 我定义: private String expensive(){ StringBuilder sb = new StringBuilder(); aLongList.forEach( (element) ->

我有一个非常昂贵的操作来生成调试消息,我希望避免每次生成调试消息

所以我用这个:

log.debug("{}", () -> expensive()); //gives the target type must be a functional interface
我定义:

private String expensive(){
    StringBuilder sb = new StringBuilder();
    aLongList.forEach( (element) -> sb.append(element));
    return sb.toString();
}

我做错了什么

我认为SLF4J不支持惰性消息参数构造,只支持惰性消息构造(使用消息格式)

但你可以用这样的方法:

if (log.isDebugEnabled()){
  log.debug(expensive());
}

这违反了声纳规则,这就是我寻找替代品的原因:(最后我切换到log4j2,它提供了我要寻找的接口。)感谢您发出信号说是slf4j故障