[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