[Java] Stream FlatMap - 두 객체 묶기
- 참고사이트
FlatMap 이란?
중복된 스트림을 1차원으로 평면화 시키는 메소드 이다.
-> 두 객체의 스트림을 하나로 묶는 것 (SQL의 JOIN과 같다고 볼 수 있다.)
FlatMap 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
List<MemberVo> memberList = Arrays.asList(
new MemberVo(1, 27, "남두현"),
new MemberVo(2, 20, "유형주"),
new MemberVo(3, 20, "태재영"),
new MemberVo(4, 40, "남궁계홍"));
List<BoardDetailVo> boardList = Arrays.asList(
new BoardDetailVo(1, "람다게시판입니다.", "람다에 관련된 클만 올려주세요."),
new BoardDetailVo(1, "람다란 무엇이니가?", "함수형 프로그래밍의 꽃?"),
new BoardDetailVo(2, "물어볼 게 있습니다.", "람다공부는 어떻게 하죠?"));
memberList.stream()
.flatMap(i ->
boardList.stream()
.filter(j -> j.getSn() == i.getSn().intValue())
.map(j -> {
MemberBoardResultVo result = new MemberBoardResultVo();
result.setSn(i.getSn());
result.setName(i.getName());
result.setContents(j.getContens());
result.setTitle(j.getTitle());
return result;
})
)
.forEach(ret -> {
System.out.println(String.format("[%s]%s:%s",
ret.getName(),
ret.getTitle(),
ret.getContents()));
});
1
2
3
[남두현]람다게시판입니다.:람다에 관련된 클만 올려주세요.
[남두현]람다란 무엇이니가?:함수형 프로그래밍의 꽃?
[유형주]물어볼 게 있습니다.:람다공부는 어떻게 하죠?
로직 설명
1) memberList의 stream이 주가 되어, flatMap 내부에서 boardList의 Stream을 사용하고 있다.
1
memberList.stream().flatMap(i -> boardList.stream()....)
2) boardList의 stream 내부 파이프라인 중 filter는 memberList 의 각 객체 중, 본인 객체의 sn이 서로 같은 것만 찾으라는 조건을 명시하고 있다.
1
filter(j -> j.getSn() == i.getSn().intValue())
3) oardList stream의 내부 map에서는 Function 의 역할로 MemberBoardResultVo 를 출력하도록 되어 있다.
람다표현식을 사용하여, MemberVo와 BoardDetailVo 에서 각각 필요한 정보를 주입한다.
1
2
3
4
5
6
7
8
map(j -> {
MemberBoardResultVo result = new MemberBoardResultVo();
result.setSn(i.getSn());
result.setName(i.getName());
result.setContents(j.getContens());
result.setTitle(j.getTitle());
return result;
})
4) foreach에서는 위의 flatMap으로부터 출력된 컨테이너를 순회하며, 필요한 정보를 출력하고 있다.
1
2
3
4
5
6
7
8
forEach(ret -> {
System.out.println(
String.format("[%s]%s:%s",
ret.getName(),
ret.getTitle(),
ret.getContents())
);
});
Leave a comment