Ich entwickle eine einfache Anwendung, die auf Spring Batch, Spring Boot, slf4j und Java 8 basiert. Ich möchte Lambda so oft wie möglich für Lernzwecke verwenden. Was ist falsch an "myPojos.stream () forEach ((myPojo) - & gt; {log.info (myPojo);});" unten? Die Nachricht beschwert sich "... gilt nicht für die Argumente <? extends MyPojo". Bitte beachten Sie, dass alle anderen drei Protokollzeilen ordnungsgemäß funktionieren.

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
    }

}
8
Jim C 29 Dez. 2015 im 00:11

2 Antworten

Beste Antwort

Logger.info erhält ein String, daher müssen Sie Ihr MyPojo in einen String mit toString() konvertieren:

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

Beachten Sie, dass Sie hier einen Teil der Robustheit verlieren können, da Sie nur eine Lambda-Anweisung haben:

myPojos.stream().forEach(myPojo -> log.info(myPojo.toString()));
10
Mureinik 28 Dez. 2015 im 21:21

Java 8 Lambda-Stil

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

3
biniam 14 Nov. 2018 im 09:25