서버&백엔드/🔥 JAVA

Java | Map과 FlatMap 차이

2024. 11. 20. 10:03
목차
  1. Map과 FlatMap 차이
  2. 주요 특징
  3. flatMap()과 map()의 차이
  4. 예제 1: map() vs flatMap()
  5. 예제 2: 문자열의 단어 추출
  6. 예제 3: 숫자 리스트를 평탄화
  7. 주요 메서드 변형
  8. 결론

Map과 FlatMap 차이


flatMap()은 Java 스트림 API에서 제공하는 중간 연산 메서드로, 스트림의 각 요소를 다른 스트림으로 변환하고, 이를 하나의 평평한 스트림(flat stream)으로 병합합니다. 즉, 각 요소가 1대1로 변환되는 map()과 달리, 각 요소가 1대다로 변환될 때 유용합니다.


주요 특징

  1. 입력과 출력:
    • flatMap은 스트림의 각 요소를 처리하여 새로운 스트림으로 변환합니다.
    • 결과적으로, 다중 레벨의 스트림이 단일 레벨의 스트림으로 평탄화(flatten)됩니다.
  2. 용도:
    • 중첩된 데이터 구조(예: 리스트 안의 리스트)를 평탄화하고 단일 레벨로 변환하는 데 유용합니다.
    • 각 요소가 리스트, 배열, 컬렉션 또는 또 다른 스트림일 때 사용됩니다.

flatMap()과 map()의 차이

  • map():
    • 입력 요소 하나를 변환하여 하나의 출력 요소로 매핑.
    • 결과는 스트림의 스트림이 될 수 있음.
  • flatMap():
    • 입력 요소 하나를 변환하여 다수의 출력 요소로 매핑.
    • 모든 결과를 하나의 평탄한 스트림으로 병합.

예제 1: map() vs flatMap()

java
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<List<String>> nestedList = Arrays.asList(
            Arrays.asList("A", "B"),
            Arrays.asList("C", "D", "E"),
            Arrays.asList("F", "G")
        );

        // map()을 사용한 경우
        List<List<String>> resultUsingMap = nestedList.stream()
            .map(list -> list)
            .collect(Collectors.toList());
        System.out.println("Using map: " + resultUsingMap);

        // flatMap()을 사용한 경우
        List<String> resultUsingFlatMap = nestedList.stream()
            .flatMap(list -> list.stream())
            .collect(Collectors.toList());
        System.out.println("Using flatMap: " + resultUsingFlatMap);
    }
}

 

출력:

Using map: [[A, B], [C, D, E], [F, G]] 
Using flatMap: [A, B, C, D, E, F, G]
 
  • map()은 각 요소를 그대로 유지하면서 리스트의 리스트(List<List<String>>) 형태를 반환합니다.
  • flatMap()은 리스트 내부의 리스트를 평탄화하여 단일 리스트(List<String>)로 반환합니다.

예제 2: 문자열의 단어 추출

java
 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<String> sentences = Arrays.asList(
            "Hello World",
            "Java Streams",
            "FlatMap Example"
        );

        // 각 문장을 단어로 분리하여 단일 리스트로 병합
        List<String> words = sentences.stream()
            .flatMap(sentence -> Arrays.stream(sentence.split(" ")))
            .collect(Collectors.toList());

        System.out.println(words);
    }
}

출력:

[Hello, World, Java, Streams, FlatMap, Example]​
  • 각 문장이 " "(공백)으로 분리되어 단어들의 스트림으로 변환됩니다.
  • flatMap()은 각 스트림을 하나의 스트림으로 병합하여 단일 리스트로 수집합니다.

예제 3: 숫자 리스트를 평탄화

java
 
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class FlatMapExample {
    public static void main(String[] args) {
        List<int[]> listOfArrays = Arrays.asList(
            new int[]{1, 2},
            new int[]{3, 4},
            new int[]{5, 6}
        );

        // 각 배열을 스트림으로 변환 후 평탄화
        List<Integer> flattenedList = listOfArrays.stream()
            .flatMapToInt(Arrays::stream)
            .boxed()
            .collect(Collectors.toList());

        System.out.println(flattenedList);
    }
}

출력:

[1, 2, 3, 4, 5, 6]
  • 각 배열(int[])이 스트림(IntStream)으로 변환되고, 평탄화 후 리스트로 수집됩니다.

주요 메서드 변형

  • flatMap(): 객체 스트림을 평탄화합니다.
  • flatMapToInt(): IntStream으로 평탄화.
  • flatMapToDouble(): DoubleStream으로 평탄화.
  • flatMapToLong(): LongStream으로 평탄화.

결론

  • flatMap()은 중첩된 스트림이나 리스트를 단일 스트림으로 평탄화하는 데 사용되며, 데이터가 계층적 구조를 가질 때 매우 유용합니다.
  • map()과의 차이를 이해하면 스트림 처리에서 보다 효율적으로 작업을 수행할 수 있습니다. 
반응형

'서버&백엔드 > 🔥 JAVA' 카테고리의 다른 글

JAVA | 이진트리 구현  (0) 2024.11.26
Stream | String문자열 내부 정렬  (0) 2024.11.21
해시맵  (0) 2024.11.17
String[]을 ArrayDeque<String>로 변환  (0) 2024.11.17
JAVA | 문자열 슬라이싱  (1) 2024.11.03
  1. Map과 FlatMap 차이
  2. 주요 특징
  3. flatMap()과 map()의 차이
  4. 예제 1: map() vs flatMap()
  5. 예제 2: 문자열의 단어 추출
  6. 예제 3: 숫자 리스트를 평탄화
  7. 주요 메서드 변형
  8. 결론
'서버&백엔드/🔥 JAVA' 카테고리의 다른 글
  • JAVA | 이진트리 구현
  • Stream | String문자열 내부 정렬
  • 해시맵
  • String[]을 ArrayDeque<String>로 변환
이재원
이재원
이재원
깃든블로그
이재원
유튜브
깃허브
전체
오늘
어제
글쓰기 관리
  • 분류 전체보기 (462)
    • WORK (11)
      • ✍🏻 기록 (8)
      • PLC (1)
    • DevOps (31)
      • 🛠️ CICD (9)
      • 🐳 Docker & Kubernetes (13)
      • 📡 AWS (3)
      • 🌌 Git (6)
    • 웹 개발 (199)
      • 🖥️ HTML&CSS (11)
      • 🌐 JavaScript (39)
      • 🍃 SpringBoot (51)
      • 🎆 JSP (15)
      • 🐍 Python (16)
      • ⚛️ React (16)
      • #️⃣ TypeScript (15)
      • 🧊 ThreeJS (13)
      • 🟩 Node.js (16)
      • 🚨 Error Log (7)
    • 서버&백엔드 (104)
      • 🔥 JAVA (53)
      • 🗃️ DataBase (22)
      • 🐧 Linux (22)
      • 🖥️ Windows (7)
    • AI (7)
      • 🤖 딥러닝 (6)
      • LLM (1)
    • 앱 개발 (1)
      • 📱 Flutter (1)
      • ReactNative (0)
    • 컴퓨터 과학 (73)
      • 🀰 디자인패턴 (10)
      • 🔢 자료구조 (11)
      • 🛜 네트워크 (12)
      • 🖥️ 운영체제 (1)
      • 🔆 프로그래밍 (6)
      • 💯 코테 (33)
    • 개인프로젝트 (4)
      • 🤪 forfun (2)
      • 💼 포트폴리오 (1)
      • 🍎 MacBook (1)
    • 자격증 (1)
      • 💯 OPIC (0)
      • 자격증 (1)
    • 꿀팁 (9)
      • ✨ 유용한 사이트 (8)
      • 📙 티스토리 (1)
    • 여행 (1)
      • ✈️ 해외여행 (1)
      • 🗺️ 국내여행 (0)
    • 음식 (6)
      • 🏰 맛집 (5)
      • 🍰 요리 (1)
    • 일상 (4)
      • 🎨 만들기 (1)
      • 🛒 쇼핑 (2)
      • 👟 운동 (1)
    • 유튜브 (7)
    • 주식 (0)
      • 미국주식 매매일지 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 티스토리챌린지
  • 키오스크
  • java
  • 사케
  • 안국역
  • 식권관리
  • 까르띠에
  • 영등포구청
  • 역삼
  • 키오스크공익
  • 가성비
  • 이자카야
  • springboot
  • JPA
  • 키오스크 공익
  • 오블완
  • 양평역
  • 한식
  • 인사동
  • 한강
  • 코딩테스트
  • thymleaf
  • 코테
  • 존맛
  • 러닝
  • 이천
  • 스프링부트
  • nestjs
  • 청담메종
  • 맛집
반응형
이재원
Java | Map과 FlatMap 차이
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.