재학습/JAVA

[Java8] StreamAPI flatMap()는 뭘까?

재이든 2022. 9. 28. 00:30
반응형

배경

아래는 1~100의 숫자에서

피타고라스의 정리에 해당되는 숫자 3개의 배열 스트림을 반환하는 코드이다.

Stream<int[]> py = IntStream.rangeClosed(1,100).boxed()
        .flatMap(
                a->IntStream.rangeClosed(a,100)
                        .filter(b->Math.sqrt(a*a+b*b)%1==0)
                        .mapToObj(b->
                                new int[]{a,b,(int)Math.sqrt(a*a+b*b)}));

py는 int[]를 스트림으로 갖는 변수

 

1.

정수형 특화 스트림의 정적메서드 rangeClosed를 통해 1~100까지의 숫자를 반환하여

이를 객체 스트림으로 반환한다.

 

2.

그 결과를 flatMap처리를 한다

 

3.

각각의 요소 a 에 접근하여 a~100까지의 숫자 스트림의

각 요소 b에 접근한다.

 

4.

a,b조합으로 피타고라스정리에 충족되는 수 들만 필터링한다.

 

5.

mapToObj를 통해 필터링된 수를 포함한 피타고라스 정리의 세 수 a,b,c를 Stream<Int[]>으로 반환한다.

 

6.

이걸 flatMap이 아니라 map으로 처리했다면

Stream<Stream<Int[]>> 의 결과가 되었을 것,

하지만 flatMap을 통해

Stream<Int[]>를 결과로 받을 수 있었다.

어떻게 이럴 수 있는걸까?

 

 

즉, FlatMap은 

'평탄화'작업을 포함한 map이다. (한 레벨만 평탄화 됨)

 

ex)

arr1.map(x => [x * 2]);

// [[2], [4], [6], [8]]

 

arr1.flatMap(x => [x * 2]);

// [2, 4, 6, 8]

 

// 한 레벨만 평탄화됨

arr1.flatMap(x => [[x * 2]]);

// [[2], [4], [6], [8]]

 

참고

반응형

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/flatMap

반응형