반응형
배경
아래는 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
반응형