map () 및 flatMap ()
map()
T는 element이고 R은 return element를 사용하여 람다 매개 변수를 함수로 가져옵니다. 마지막에는 Type R의 객체가있는 Stream이 있습니다. 간단한 예는 다음과 같습니다.
Stream
.of(1,2,3,4,5)
.map(myInt -> "preFix_"+myInt)
.forEach(System.out::println);
단순히 Type의 1 ~ 5 요소를 가져 와서 Integer
각 요소를 사용 String
하여 값 으로 type에서 새 요소를 작성 "prefix_"+integer_value
하고 인쇄합니다.
flatMap()
flatMap () 함수 F<T, R>
는
T는 에서 /으로 스트림을 빌드 할 수 있는 유형 입니다 . List (T.stream ()), Array (Arrays.stream (someArray)) 등이 될 수 있습니다. 아래 예제에서 각 개발자는 많은 언어를 가지고 있으므로 dev. 언어는 목록이며 람다 매개 변수를 사용합니다.
R은 T를 사용하여 빌드되는 결과 스트림입니다. T의 인스턴스가 많음을 알면 당연히 R의 스트림이 많이 있습니다. 유형 R의 모든 스트림은 이제 유형 R의 단일 '플랫'스트림 으로 결합됩니다. .
예
Bachiri Taoufiq의 예는 여기 에 대한 대답 이 간단하고 이해하기 쉽다는 것을 알 수 있습니다. 명확성을 위해 개발자 팀이 있다고 가정 해 보겠습니다.
dev_team = {dev_1,dev_2,dev_3}
, 각 개발자는 여러 언어를 알고 있습니다.
dev_1 = {lang_a,lang_b,lang_c},
dev_2 = {lang_d},
dev_2 = {lang_e,lang_f}
dev_team에 Stream.map () 을 적용 하여 각 개발자의 언어를 가져옵니다.
dev_team.map(dev -> dev.getLanguages())
이 구조를 제공합니다 :
{
{lang_a,lang_b,lang_c},
{lang_d},
{lang_e,lang_f}
}
기본적으로 List<List<Languages>> /Object[Languages[]]
. 별로 예쁘지도 않고 Java8과 비슷합니다!
으로 Stream.flatMap()
는 상기 구조 걸리는대로 일을 '평평'수
와에 회전을 {lang_a, lang_b, lang_c, lang_d, lang_e, lang_f}
기본적으로 사용 할 수 있습니다 List<Languages>/Language[]/etc
...
결국 코드는 다음과 같이 더 의미가 있습니다.
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.map(dev -> dev.getLanguages()) /* {{lang_a,...,lang_c},{lang_d}{lang_e,lang_f}}} */
.flatMap(languages -> languages.stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
또는 간단히 :
dev_team
.stream() /* {dev_1,dev_2,dev_3} */
.flatMap(dev -> dev.getLanguages().stream()) /* {lang_a,...,lang_d, lang_e, lang_f} */
.doWhateverWithYourNewStreamHere();
map ()을 사용하고 flatMap ()을 사용하는 경우 :
map()
스트림에서 T 유형의 각 요소가 R 유형 의 단일 요소에 맵핑 / 변환되어야하는 경우에 사용하십시오 . 결과는 유형 (1 시작 요소-> 1 끝 요소) 의 맵핑 과 R 유형의 요소의 새 스트림입니다. 반환됩니다.
flatMap()
스트림에서 T 유형의 각 요소가 R 유형의 요소 콜렉션 에 맵핑 / 변환 될 때 사용 됩니다 . 결과는 유형의 맵핑입니다 (1 시작 요소-> n 끝 요소) . 그런 다음이 컬렉션은 R 유형의 새로운 요소 스트림에 병합 (또는 병합 )됩니다. 예를 들어 중첩 루프 를 나타내는 데 유용합니다 .
프리 자바 8 :
List<Foo> myFoos = new ArrayList<Foo>();
for(Foo foo: myFoos){
for(Bar bar: foo.getMyBars()){
System.out.println(bar.getMyName());
}
}
포스트 자바 8
myFoos
.stream()
.flatMap(foo -> foo.getMyBars().stream())
.forEach(bar -> System.out.println(bar.getMyName()));
map :: Stream T -> (T -> R) -> Stream R
,flatMap :: Stream T -> (T -> Stream R) -> Stream R
.