1. 개요
map () 및 flatMap () API는 기능 언어에서 비롯됩니다. Java 8에서는 Optional , Stream 및 CompletableFuture 에서 찾을 수 있습니다 (약간 다른 이름 으로 사용됨 ).
스트림 은 일련의 객체를 나타내는 반면 선택 사항은 존재하거나 없을 수있는 값을 나타내는 클래스입니다. 다른 집계 작업 중에서 map () 및 flatMap () 메서드가 있습니다.
둘 다 동일한 반환 유형을 가지고 있음에도 불구하고 상당히 다릅니다. 스트림과 옵션의 몇 가지 예를 분석하여 이러한 차이점을 설명하겠습니다.
2. optioanal에서 Map,Flatmap 사용방법
지도 () 메소드는 잘 작동 옵션 - 함수가 반환하는 경우 정확한 우리를 입력 할 필요가 :
Optional<String> s = Optional.of("test");
assertEquals(Optional.of("TEST"), s.map(String::toUpperCase));
그러나 더 복잡한 경우에는 Optional 도 반환하는 함수가 제공 될 수 있습니다 . 이러한 경우 map ()을 사용 하면 map () 구현이 내부적으로 추가 래핑을 수행 하므로 중첩 된 구조가됩니다 .
이 상황을 더 잘 이해하기 위해 다른 예를 살펴 보겠습니다.
assertEquals(Optional.of(Optional.of("STRING")),
Optional
.of("string")
.map(s -> Optional.of("STRING")));
보시다시피, 우리는 Optional <Optional <String >> 중첩 구조로 끝납니다 . 작동하지만 사용하기가 매우 번거롭고 추가적인 null 안전을 제공하지 않으므로 평평한 구조를 유지하는 것이 좋습니다.
이것이 바로 flatMap () 이 우리에게 도움이되는 것입니다.
assertEquals(Optional.of("STRING"), Optional
.of("string")
.flatMap(s -> Optional.of("STRING")));
3. 스트림에서 Map, Flatmap 사용방법
두 방법 모두 선택 사항에 대해 유사하게 작동 합니다.
맵 () 방법은 기본 시퀀스의 랩 스트림 반면, 예를 flatMap () 메소드가 중첩 피하는 허용 스트림 <스트림 <R >> 구조.
여기서 map () 은 입력 Stream 의 요소에 toUpperCase () 메서드를 적용한 결과로 구성된 Stream을 생성합니다 .
List<String> myList = Stream.of("a", "b")
.map(String::toUpperCase)
.collect(Collectors.toList());
assertEquals(asList("A", "B"), myList);
map () 은 이러한 간단한 경우에 꽤 잘 작동합니다. 그러나 입력으로 목록 목록과 같이 더 복잡한 것이 있으면 어떻게 될까요?
작동 원리를 살펴 보겠습니다.
List<List<String>> list = Arrays.asList(
Arrays.asList("a"),
Arrays.asList("b"));
System.out.println(list);
이 스 니펫은 [[a], [b]] 목록 목록을 인쇄합니다 .
이제 flatMap ()을 사용합시다 .
System.out.println(list
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()));
이러한 스 니펫의 결과는 [a, b] 로 병합됩니다 .
T 그는 flatMap () 메소드는 우선 입력 평평 스트림 의 스트림 A와 스트림 의 문자열 (이 참조 병합에 대한 자세한에 대한 기사를 ). 이후에는 map () 메서드 와 유사하게 작동합니다 .
4. 결론
Java 8은 원래 기능 언어에서 사용되었던 map () 및 flatMap () 메서드 를 사용할 수있는 기회를 제공 합니다.
Streams 및 Optionals 에서 호출 할 수 있습니다 . 이러한 메서드는 제공된 매핑 기능을 적용하여 매핑 된 개체를 가져 오는 데 도움이됩니다.