【问题标题】:how to use forEach with slf4j.logger.info如何将 forEach 与 slf4j.logger.info 一起使用
【发布时间】:2016-04-02 17:38:22
【问题描述】:

我正在开发一个基于 Spring Batch、Spring Boot、slf4j 和 Java 8 的简单应用程序。我想尽可能多地使用 lambda 来进行学习。 “myPojos.stream()forEach((myPojo)-> {log.info(myPojo);});”有什么问题以下?消息抱怨“...不适用于参数<? extends MyPojo”。请注意,所有其他三个日志行都正常工作。

public class CustomItemWriter implements ItemWriter<MyPojo> {

    private static final Logger log = LoggerFactory.getLogger(CustomItemWriter.class);

    @Override
    public void write(List<? extends MyPojo> myPojos) throws Exception{
        myPojos.stream().forEach((myPojo)-> {log.info(myPojo);});//error
        myPojos.forEach(System.out::println);//it works
        myPojos.stream().forEach((myPojo) -> {System.out.println(myPojo);}); //it works
        log.info("finish"); //it works
    }

}

【问题讨论】:

    标签: java lambda java-8 log4j slf4j


    【解决方案1】:

    Logger.info 收到 String,因此您必须将您的 MyPojo 转换为带有 toString() 的字符串:

    myPojos.stream().forEach((myPojo) -> {log.info(myPojo.toString());});
    

    请注意,由于您只有一个语句 lambda,因此您可能会失去一些稳健性:

    myPojos.stream().forEach(myPojo -> log.info(myPojo.toString()));
    

    【讨论】:

    • 穆雷尼克,谢谢。我非常专注于尝试 lambda,以至于我没有注意到错误有多简单。
    【解决方案2】:

    Java 8 lambda 样式。
    在班级级别添加@Slf4j

    myPojos.stream().forEach(log::info);

    【讨论】:

    • 对我不起作用,我在下面有错误编译:无法解析方法“信息”
    • @Jacob 你的班级中有log 变量吗?在班级级别使用private static final Logger log = LoggerFactory.getLogger(CustomItemWriter.class); 或@Slf4j?
    • 不起作用,因为对 'info' 的引用不明确,'info(String)' 和 'info(String, Object)' 都匹配
    • 你有@Slf4j在课堂上吗?
    猜你喜欢
    • 2011-06-03
    • 2013-09-11
    • 2014-05-21
    • 2013-05-10
    • 2016-12-20
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多