Java8에서 Stream.forEach Slf4j의 Logger 메소드를 사용하면 에러가 발생한다.
해당 이유는 Slf4j의 Logger.info() 의 매개변수가 모두 String이기 때문이다.

(참고로 Commons의 Log.info()의 매개변수는 모두 Object이기 때문에 Streams.forEach안에서 사용하면 문제가 발생하지 않는다.)


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConvertObjectTest {
private Logger logger = LoggerFactory.getLogger(ConvertObjectTest.class);

@Test
public void convertObjectListWithFunctionTest() {

OneMember samuel = new OneMember(1, "Samuel");
OneMember daisy = new OneMember(2, "Daisy");
OneMember matt = new OneMember(3, "Matt");

List<String> persons = Stream.of(samuel, daisy, matt)
.map(OnePerson::new)
.sorted(comparing(OnePerson::getId))
.collect(toList())
.forEach(Logger::info); } }



에러가 발생하지 않게 하기 위해서는 객체를 String으로 변환시키고 peek을 실행시키는 방법을 사용한다.




import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConvertObjectTest {
private Logger logger = LoggerFactory.getLogger(ConvertObjectTest.class);

@Test
public void convertObjectListWithFunctionTest() {

OneMember samuel = new OneMember(1, "Samuel");
OneMember daisy = new OneMember(2, "Daisy");
OneMember matt = new OneMember(3, "Matt");

List<String> persons = Stream.of(samuel, daisy, matt)
.map(OnePerson::new)
.sorted(comparing(OnePerson::getId))
.map(OnePerson::toString)
.peek(logger::error)
.collect(toList());

}


Posted by 김용환 '김용환'

댓글을 달아 주세요