Stream Map vs flatMap ๐Ÿ”„

์ž„๊ทœ์„ฑยท2025๋…„ 7์›” 20์ผ
0
post-thumbnail

1. Stream Map

Stream<InputClass> -> Stream<OutPutClass>
๋‹จ์ˆœํžˆ stream์˜ ํƒ€์ž…์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ์—ฐ์‚ฐ์„ ํ•ด์ค€๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํšŒ์› Stream(๋ฐฐ์—ด)์ด ์žˆ๋‹ค๊ณ  ํ•˜๊ณ  ์ด ๋•Œ ํšŒ์›์˜ ๋‚˜์ด์˜ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ์‹ถ์–ดํ•œ๋‹ค ๊ทธ๋ ‡๋‹ค๋ฉด
Stream<Member> -> Stream<Integer>
๋กœ ๋ณ€ํ™˜์ด ๋  ๊ฒƒ์ด๋‹ค.

์ฝ”๋“œ

List<Member> members = Arrays.asList(
            new Member("Alice", 25),
            new Member("Bob", 30),
            new Member("Charlie", 28)
        );

        List<Integer> ages = members.stream()
                                    .map(Member::getAge)  // ๋˜๋Š” .map(m -> m.getAge())
                                    .collect(Collectors.toList());

        System.out.println(ages);  // [25, 30, 28]

์ด๋•Œ map.distinct() map.sorted๊ฐ™์€ ๋ฉ”์„œ๋“œ๋กœ ์ •๋ ฌ ๋ฐ ์ค‘๋ณต์ œ๊ฑฐ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

List<Member> members = Arrays.asList(
            new Member("Alice", 25),
            new Member("Bob", 30),
            new Member("Charlie", 28),
            new Member("David", 30)   // ์ค‘๋ณต๋œ ๋‚˜์ด
        );

        // ๋‚˜์ด๋งŒ ์ถ”์ถœํ•ด์„œ ์ค‘๋ณต ์ œ๊ฑฐ + ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
        List<Integer> sortedDistinctAges = members.stream()
                .map(Member::getAge)         // Stream<Integer>
                .distinct()                  // ์ค‘๋ณต ์ œ๊ฑฐ
                .sorted()                    // ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ
                .collect(Collectors.toList());

        System.out.println(sortedDistinctAges);  // ์ถœ๋ ฅ: [25, 28, 30]

2. Flat Map

Stream<Stream<OutPutClass>> โ†’ Stream<OutPutClass>
์ค‘์ฒฉ๋œ ์ŠคํŠธ๋ฆผ ๊ตฌ์กฐ๋ฅผ ํ‰ํƒ„ํ™”(Flatten)ํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

์ฆ‰, List<List<String>> โ†’ List<String>
Stream<List<String>> โ†’ Stream<String>
์ด๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ํŽผ์น  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

st<Member> members = Arrays.asList(
            new Member("Alice", Arrays.asList("Reading", "Traveling")),
            new Member("Bob", Arrays.asList("Cooking", "Gaming")),
            new Member("Charlie", Arrays.asList("Traveling", "Music"))
        );

        // ๋ชจ๋“  ํšŒ์›์˜ ์ทจ๋ฏธ๋ฅผ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ‰ํƒ„ํ™”
        List<String> allHobbies = members.stream()
                .flatMap(member -> member.getHobbies().stream())  // Stream<String>
                .distinct()     // ์ค‘๋ณต ์ œ๊ฑฐ
                .sorted()       // ์ •๋ ฌ
                .collect(Collectors.toList());

        System.out.println(allHobbies);  // ์ถœ๋ ฅ: [Cooking, Gaming, Music, Reading, Traveling]

ํ•ต์‹ฌ ์š”์•ฝ

๋ฉ”์„œ๋“œ์„ค๋ช…
map()์š”์†Œ๋ฅผ ๋ณ€ํ™˜ (1:1 ๋งคํ•‘)
flatMap()์ค‘์ฒฉ๋œ ๊ตฌ์กฐ๋ฅผ ํŽผ์ณ์„œ ํ‰ํƒ„ํ™” (1:N โ†’ 1:1 ๋งคํ•‘)
profile
์‚ถ์˜ ์งˆ์„ ๋†’์—ฌ์ฃผ๋Š” ๊ฐœ๋ฐœ์ž

0๊ฐœ์˜ ๋Œ“๊ธ€