๐Ÿ“Œ ์ž๋ฐ” ์ŠคํŠธ๋ฆผ(Stream) API ํ™œ์šฉ ์ •๋ฆฌ

My Pale Blue Dotยท2025๋…„ 3์›” 20์ผ
0

JAVA

๋ชฉ๋ก ๋ณด๊ธฐ
30/35
post-thumbnail

๐Ÿ“… ๋‚ ์งœ

2025๋…„ 3์›” 20์ผ

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ


โœ… ์ŠคํŠธ๋ฆผ(Stream) API๋ž€?

์ŠคํŠธ๋ฆผ(Stream) API๋Š” ์ž๋ฐ”์˜ ์ปฌ๋ ‰์…˜(List, Set, Map) ๋ฐ ๋ฐฐ์—ด์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ์ œ๊ณตํ•œ๋‹ค.

๐ŸŽฏ ์ŠคํŠธ๋ฆผ(Stream) API์˜ ์ฃผ์š” ํŠน์ง•

  1. ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ: ๋žŒ๋‹ค์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์—†์ด ์ฒ˜๋ฆฌ: ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹.
  3. ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ์ง€์›: .parallelStream()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU์—์„œ ๋ณ‘๋ ฌ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ.
  4. ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ ๊ตฌ๋ถ„: ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ์—ฐ์‚ฐ์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

1๏ธโƒฃ flatMap() - ๋‹ค์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹จ์ผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜ (C02FlatMap.java)

๐Ÿ’ก ์ค‘์ฒฉ๋œ ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ๋ฅผ ํŽผ์ณ์„œ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์‚ฌ์šฉ๋จ.

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

public class C02FlatMap {
    public static void main(String[] args) {
        // ์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        List<List<Integer>> numbers = Arrays.asList(
            Arrays.asList(1, 2, 3),
            Arrays.asList(4, 5, 6),
            Arrays.asList(7, 8, 9)
        );

        // flatMap์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์ŠคํŠธ ํ‰ํƒ„ํ™”
        List<Integer> list = numbers.stream()
                                    .flatMap(List::stream)
                                    .collect(Collectors.toList());

        System.out.println(numbers); // ์›๋ณธ ์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
        System.out.println(list);    // ํ‰ํƒ„ํ™”๋œ ๋ฆฌ์ŠคํŠธ ์ถœ๋ ฅ
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

2๏ธโƒฃ distinct() - ์ค‘๋ณต ์ œ๊ฑฐ (C03Distinct.java)

๐Ÿ’ก ๋ฆฌ์ŠคํŠธ์—์„œ ์ค‘๋ณต๋œ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์œ ์ผํ•œ ์š”์†Œ๋งŒ ํฌํ•จ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

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

public class C03Distinct {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 5, 5);
        System.out.println("์›๋ณธ ๋ฆฌ์ŠคํŠธ: " + list);

        // ์ค‘๋ณต ์ œ๊ฑฐ
        List<Integer> distinctedList = list.stream()
                                           .distinct()
                                           .collect(Collectors.toList());

        System.out.println("์ค‘๋ณต ์ œ๊ฑฐ ๋ฆฌ์ŠคํŠธ: " + distinctedList);
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

์›๋ณธ ๋ฆฌ์ŠคํŠธ: [1, 2, 2, 3, 3, 3, 4, 5, 5]
์ค‘๋ณต ์ œ๊ฑฐ ๋ฆฌ์ŠคํŠธ: [1, 2, 3, 4, 5]

3๏ธโƒฃ sorted() - ์ •๋ ฌ (C04Sorted.java)

๐Ÿ’ก ๋ฆฌ์ŠคํŠธ ์š”์†Œ๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉ๋จ.

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

public class C04Sorted {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 4);

        // ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ
        List<Integer> sortedNumbers = numbers.stream()
                                             .sorted()
                                             .collect(Collectors.toList());

        System.out.println("์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ: " + sortedNumbers);
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ: [1, 2, 4, 5, 8]

4๏ธโƒฃ limit() - ํŠน์ • ๊ฐœ์ˆ˜๋งŒ ์ถœ๋ ฅ (C05Limited.java)

๐Ÿ’ก ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ N๊ฐœ์˜ ์š”์†Œ๋งŒ ์„ ํƒํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•จ.

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

public class C05Limited {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // ์ฒ˜์Œ 3๊ฐœ์˜ ์š”์†Œ๋งŒ ์„ ํƒ
        List<Integer> limitedNumbers = numbers.stream()
                                              .limit(3)
                                              .collect(Collectors.toList());

        System.out.println("์ œํ•œ๋œ ๋ฆฌ์ŠคํŠธ: " + limitedNumbers);
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

์ œํ•œ๋œ ๋ฆฌ์ŠคํŠธ: [1, 2, 3]

5๏ธโƒฃ skip() - ์ฒ˜์Œ N๊ฐœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ (C06Skip.java)

๐Ÿ’ก ์•ž์˜ N๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€ ์š”์†Œ๋งŒ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜ํ•จ.

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

public class C06Skip {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);

        // ์ฒ˜์Œ 2๊ฐœ ์š”์†Œ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
        List<Integer> skippedNumbers = numbers.stream()
                                              .skip(2)
                                              .collect(Collectors.toList());

        System.out.println("๊ฑด๋„ˆ๋›ด ๋ฆฌ์ŠคํŠธ: " + skippedNumbers);
    }
}

๐Ÿ”น ์ถœ๋ ฅ ๊ฒฐ๊ณผ

๊ฑด๋„ˆ๋›ด ๋ฆฌ์ŠคํŠธ: [3, 4, 5]

6๏ธโƒฃ ์ตœ์ข… ์—ฐ์‚ฐ (C07์ตœ์ข…์—ฐ์‚ฐ.java)

๐Ÿ’ก ์ŠคํŠธ๋ฆผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•œ ํ›„ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์—ฐ์‚ฐ.

โœ… ์ฃผ์š” ์ตœ์ข… ์—ฐ์‚ฐ

๋ฉ”์„œ๋“œ์„ค๋ช…
forEach()๊ฐ ์š”์†Œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์‹คํ–‰
collect()๊ฒฐ๊ณผ๋ฅผ ์ปฌ๋ ‰์…˜(List, Set)์œผ๋กœ ๋ณ€ํ™˜
reduce()๋ชจ๋“  ์š”์†Œ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ๊ฒฐํ•ฉ
min()์ตœ์†Œ๊ฐ’ ๋ฐ˜ํ™˜
max()์ตœ๋Œ€๊ฐ’ ๋ฐ˜ํ™˜
count()์š”์†Œ ๊ฐœ์ˆ˜ ๋ฐ˜ํ™˜
anyMatch()ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Comparator;

public class C07์ตœ์ข…์—ฐ์‚ฐ {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 4);

        // ์ตœ์†Œ๊ฐ’
        Optional<Integer> minNumber = numbers.stream()
                                             .min(Comparator.naturalOrder());
        System.out.println("์ตœ์†Œ๊ฐ’: " + minNumber.orElse(0));

        // ์ตœ๋Œ€๊ฐ’
        Optional<Integer> maxNumber = numbers.stream()
                                             .max(Comparator.naturalOrder());
        System.out.println("์ตœ๋Œ€๊ฐ’: " + maxNumber.orElse(0));

        // ์ด ๊ฐœ์ˆ˜
        long count = numbers.stream().count();
        System.out.println("๊ฐœ์ˆ˜: " + count);
    }
}

๐Ÿ”ฅ ์ •๋ฆฌ

  • flatMap() โ†’ ์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹จ์ผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜
  • distinct() โ†’ ์ค‘๋ณต ์ œ๊ฑฐ
  • sorted() โ†’ ์ •๋ ฌ
  • limit() โ†’ ์ฒ˜์Œ N๊ฐœ ์„ ํƒ
  • skip() โ†’ ์ฒ˜์Œ N๊ฐœ ์ œ์™ธ
  • ์ตœ์ข… ์—ฐ์‚ฐ (min(), max(), count(), reduce()) ํ™œ์šฉ

profile
Here, My Pale Blue.๐ŸŒ

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