๐Ÿ˜บ ์–ธ์–ด/โ˜•Java

[Java] ์ŠคํŠธ๋ฆผ Stream ๊ฐœ๋…๊ณผ Stream API ์ด์ •๋ฆฌ

์†Œ์˜ ๐Ÿ€ 2025. 2. 13. 13:01
๋ฐ˜์‘ํ˜•

๐Ÿ”Ž ์ฃผ์ œ

์˜ค๋Š˜์€ Stream API ์ž์ฒด์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ณ ์ž ํ•œ๋‹ค.

โœ… Stream

Collection Framework

  • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์กฐ์ž‘ํ•˜๋Š” ๊ตฌ์กฐ์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • List, Set, Map๋“ค์ด ํฌํ•จ๋˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅ, ๊ฒ€์ƒ‰, ์‚ญ์ œํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์œ„ ๊ตฌ์กฐ๋“ค์— ๋Œ€ํ•ด์„œ๋Š” ์ฐจํ›„ ๋‹ค๋ฅธ ๊ธ€๋กœ ๋‹ค๋ฃจ๊ฒ ๋‹ค.

Stream

  • ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์†Œ์Šค์™€ ์—ฐ๊ฒฐ๋˜์–ด ์˜์†๋œ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ œ๊ณตํ•œ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฅผ ์ผํšŒ์„ฑ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ.
    • ์˜์†: "์ŠคํŠธ๋ฆผ ์ž‘์—… ํ›„์—๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€ํ™”ํ•˜์ง€ ์•Š๊ณ  ์ง€์†์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค"๋Š” ๋œป์ด๋‹ค.
    • ๋ถˆ๋ณ€์„ฑ: ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋„ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์›๋ณธ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ง€์—ฐ ์ฒ˜๋ฆฌ: ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ
    • ์ค‘๊ฐ„ ์—ฐ์‚ฐ: ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋  ๋•Œ๊นŒ์ง€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ , ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋˜๋ฉด ํ•œ ๋ฒˆ์— ๋™์ž‘ํ•œ๋‹ค. ex) map(), filter(), sorted()...
    • ์ตœ์ข… ์—ฐ์‚ฐ: ์ŠคํŠธ๋ฆผ์„ ์†Œ๋ชจํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ตœ์ข… ์—ฐ์‚ฐ์ด ํ˜ธ์ถœ๋˜๋ฉด ์ด ์ŠคํŠธ๋ฆผ์€ ๋‹ซํ˜€ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. -> ๋ฐ์ดํ„ฐ ๋ถˆ๋ณ€์„ฑ์„ ๋ณด์žฅ.
    • ๋ถˆํ•„์š”ํ•œ ์—ฐ์‚ฐ์„ ์ค„์—ฌ ํšจ์œจ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•œ๋‹ค.(feat. ๋žŒ๋‹ค ํ‘œํ˜„์‹)

โœ… Stream์˜ ์žฅ์ 

  • ๊ฐ€๋…์„ฑ์ด ๋†’๋‹ค: ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์€ ๊ฐ„๊ฒฐํ•˜๊ณ , ์ต์ˆ™ํ•ด์ง€๋ฉด ์ฝ๊ธฐ๋„ ์‰ฝ๋‹ค.
  • ์‰ฌ์šด ์œ ์ง€๋ณด์ˆ˜: ๊ฐ„๊ฒฐํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋กœ์ง์ด๋ผ ์ˆ˜์ •์ด ์‰ฝ๋‹ค.
  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ: parallel() ๋˜๋Š” parallelStream()์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ๋ณ‘๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

โŽ Stream์˜ ๋‹จ์ 

  • ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž‘์€ ๋ฐ์ดํ„ฐ์…‹์—๋Š” ๋‹จ์ˆœํ•œ ๋ฐ˜๋ณต๋ฌธ์ด ๋‚ซ๋‹ค.
  • ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค.

โœ… ์ฃผ์š” Stream API

Stream API๋Š” ์ŠคํŠธ๋ฆผ์— ์žˆ๋Š” ์—ฐ์‚ฐ ๊ธฐ๋Šฅ์„ ๋งํ•œ๋‹ค. ์ค‘๊ฐ„ ์—ฐ์‚ฐ๊ณผ ์ตœ์ข… ์—ฐ์‚ฐ์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค.

  • ์ค‘๊ฐ„ ์—ฐ์‚ฐ: ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™”๋‚˜๊ฑฐ๋‚˜ ํ•„ํ„ฐ๋งํ•˜๋Š” ๋“ฑ ํ•˜๋‚˜์˜ ์ŠคํŠธ๋ฆผ์—์„œ ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์„ ์—ฐ์†ํ•ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • map(), filter(), sorted(), ...
  • ์ตœ์ข… ์—ฐ์‚ฐ: ์ŠคํŠธ๋ฆผ์„ ์†Œ๋ชจํ•ด์„œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ํ•˜๋‚˜๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
    • forEach(), collect(), reduce(), ...

๐Ÿ› ๏ธ ์ค‘๊ฐ„ ์—ฐ์‚ฐ

filter()

์กฐ๊ฑด์— ๋งž๋Š” ์š”์†Œ๋งŒ ์„ ํƒํ•œ๋‹ค.

List<Integer> numbers = Arrays.asList(1,2,3,4,5);
numbers.stream()
    .filter(n -> n >2 )
    .forEach(System.out::println);  
--------------------------
 3
 4
 5

map()

๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•ด์„œ ์ƒˆ๋กœ์šด ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์˜ˆ์‹œ์—์„œ๋Š” ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ ๋ฐ”๊พผ๋‹ค.

List<String> names = Arrays.asList("Alice", "Bob", "Christine");
names.stream()
     .map(String::toUpperCase)
     .forEach(System.out::println);     
--------------------------
ALICE
BOB
CHRISTINE

flatMap()

์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ผ ํ‰๋ฉด ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ฆ‰ ์—ฌ๋Ÿฌ ๊ณ„์ธต์œผ๋กœ ์ค‘์ฒฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ’€์–ด ํ”Œ๋žซํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

List<List<String>> nestedList = Arrays.asList(
            Arrays.asList("A", "B"),
            Arrays.asList("C", "D"),
            Arrays.asList("E", "F")
        );

        List<String> flatList = nestedList.stream()
            .flatMap(List::stream)
            .collect(Collectors.toList());
System.out.println(flatList);
--------------------------
[A, B, C, D, E, F]

map()๊ณผ ๋‹ค๋ฅธ ์ ์€ "์ž…๋ ฅ ๊ฐœ์ˆ˜์™€ ์ถœ๋ ฅ ๊ฐœ์ˆ˜๊ฐ€ ๋ฐ˜๋“œ์‹œ ๊ฐ™์ง€๋Š” ์•Š๋‹ค"๋Š” ์ ์ด๋‹ค.

map()์˜ ์˜ˆ์‹œ์—์„œ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์™€ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ์—์„œ ๋‹ค์Œ ๋งคํ•‘ ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

  • Alice -> ALICE
  • Bob -> BOB
  • Christine -> CHRISTINE

ํ•˜๋‚˜์˜ ์ž…๋ ฅ์— ๋Œ€ํ•ด์„œ ํ•˜๋‚˜์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” 1:1 ๊ด€๊ณ„์ด๋‹ค.

flatMap()์—์„œ๋Š” ๋‹ค์Œ ๋งคํ•‘ ๊ด€๊ณ„๊ฐ€ ์„ฑ๋ฆฝํ•œ๋‹ค.

  • ("A", "B") -> "A", "B"
  • ("C", "D") -> "C", "D"
  • ("E", "F") -> "E", "F"

nestedList๋Š” ์ค‘์ฒฉ ๋ฆฌ์ŠคํŠธ๋กœ ๊ฐ๊ฐ์˜ ์š”์†Œ์— ์ ‘๊ทผํ•ด๋„ ์—ฌ๋Ÿฌ ๊ฐ’์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฆฌ์ŠคํŠธ์ด๋‹ค.
nestedList์—์„œ์˜ stream()์€ ๋ฆฌ์ŠคํŠธ ("A" ,"B")๋ผ๋Š” ํ•˜๋‚˜์˜ ์ž…๋ ฅ์„ ๋ฐ›์•„ "A", "B"๋กœ ๋‚˜๋ˆˆ๋‹ค.

์ฆ‰ ์ค‘์ฒฉ ๊ตฌ์กฐ์˜€๋˜ nestedList๋ฅผ ์ผ์ฐจ์›์œผ๋กœ ํˆ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
collect()๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋‹ค์Œ์ฒ˜๋Ÿผ ํ”Œ๋žซํ•ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋”ฐ๋กœ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

List<String> flatList = nestedList.stream()
                                .flatMap(List::stream)
                                .collect(Collectors.toList());

sorted()

๊ธฐ์ค€์— ๋”ฐ๋ผ ์ •๋ ฌํ•œ๋‹ค. ๊ธฐ์ค€์„ ๋”ฐ๋กœ ์ฃผ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

numbers.stream()
    .sorted()
    .forEach(System.out::println);

์›ํ•˜๋Š” ๊ธฐ์ค€์„ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด Comparator๋‚˜ Comparator.comparing()์„ ์ด์šฉํ•˜์ž.

  • Comparator
List<Integer> numbers = Arrays.asList(5, 2, 8, 1, 3);
List<Integer> sorted = numbers.stream()
                                      .sorted((a, b) -> b - a)
                                      .collect(Collectors.toList());    

---

\[8, 5, 3, 2, 1\]
  • Comparator.comparing()
List words = Arrays.asList("appleJuice", "banana", "apricot!", "cherry");

List sorted = words.stream()  
.sorted(Comparator.comparing(String::length)) //๊ธธ์ด ๊ธฐ์ค€ ์˜ค๋ฆ„์ฐจ์ˆœ  
.collect(Collectors.toList());

---

\[appleJuice, apricot!, banana, cherry\]

distinct()

์ค‘๋ณต ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.


List names = Arrays.asList("Alice", "Alice", "Bob", "Cindy");  
names.stream()  
.distinct()  
.forEach(System.out::println);

---

\[Alice, Bob, Cindy\]

skip()

์ฒ˜์Œ n๊ฐœ์˜ ์š”์†Œ๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  ์—ฐ์‚ฐํ•œ๋‹ค.


List numbers = Arrays.asList(1,2,3,4,5);  
numbers.stream()  
.skip(2)  
.forEach(System.out::println);

---

3, 4, 5

limit()

์ŠคํŠธ๋ฆผ์ด ๊ฐ€์ ธ์˜ค๋Š” ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ n๊ฐœ๋กœ ์ œํ•œํ•œ๋‹ค.


List numbers = Arrays.asList(1,2,3,4,5);  
numbers.stream()  
.limit(3)  
.forEach(System.out::println);

---

1, 2, 3

๐Ÿ› ๏ธ ์ตœ์ข… ์—ฐ์‚ฐ

forEach()

๊ฐ ์š”์†Œ๋ฅผ ์†Œ๋น„ํ•œ๋‹ค.


numbers.stream()  
.forEach(System.out::println); // ๋ฉ”์†Œ๋“œ ๋ ˆํผ๋Ÿฐ์Šค ๋ฐฉ์‹

numbers.stream()  
.forEach(num -> {  
System.out.println(num); // ๋žŒ๋‹ค ๋ฐฉ์‹  
}); // ๊ฐ ์š”์†Œ ์ถœ๋ ฅ

collect()

๊ฒฐ๊ณผ๋ฅผ ํŠน์ • ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

List numbers = Arrays.asList(1, 2, 3);  
// ๊ฐ ์š”์†Œ๋ฅผ ์ œ๊ณฑํ•œ ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ˜ํ™˜  
List squares = numbers.stream()  
.map(number -> number\*number)  
.collect(Collectors.toList());

// ๋‹จ์–ด๋ฅผ ํ‚ค๋กœ, ๊ธธ์ด๋ฅผ ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๋งต์œผ๋กœ ๋ฐ˜ํ™˜  
List words = Arrays.asList("apple", "banana", "cherry");  
Map<String, Integer> result = words.stream()  
.collect(Collectors.toMap(word -> word, String::length));

reduce()

๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

reduce(์ดˆ๊ธฐ๊ฐ’, ๊ฒฐํ•ฉ๋ฐฉ์‹)๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

List numbers = Arrays.asList(1, 2, 3, 4, 5);

//๊ฐ ์š”์†Œ์˜ ๊ฐ’ ๋”ํ•˜๊ธฐ  
int sum = numbers.stream()  
.reduce(0, (a,b) -> a + b); //์ดˆ๊ธฐ๊ฐ’ 0์—์„œ๋ถ€ํ„ฐ ๋‘ ๊ฐ’์„ ๋”ํ•จ

//์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ  
int max = numbers.stream()  
.reduce(Integer.MIN\_VALUE, (a, b) -> a > b ? a : b); // Integer.MIN\_VALUE๋กœ ์ดˆ๊ธฐํ™”

anyMatch(), allMatch(), noneMatch()

์ผ์น˜ํ•˜๋Š” ์š”์†Œ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๋Š”๋‹ค. ๊ฒฐ๊ณผ๋Š” boolean์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • anyMatch(): ์ผ์น˜ํ•˜๋Š” ์š”์†Œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ์œผ๋ฉด true
  • allMatch(): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋ฉด true
  • noneMatch(): ๋ชจ๋“  ์š”์†Œ๊ฐ€ ์กฐ๊ฑด์„ ๋งŒ์กฑ ๋ชปํ•˜๋ฉด true
List names = Arrays.asList("Alice", "Bob", "Cindy", "Daniel", "Edward", "Felilx");

// false  
boolean hasLongName = names.stream()  
.anyMatch(name -> name.length() > 10);

//true  
boolean allShortNames = names.stream()  
.allMatch(name -> name.length() < 10);

//true  
boolean noNameStartWithZ = names.stream()  
.noneMatch(name -> name.startsWith("z")); // "z" ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ด๋ฆ„์ด ์—†๋Š”์ง€ ํ™•์ธ

findFirst(), findAny()

์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

  • findFirst(): ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • findAny(): ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ˆœ์ฐจ ์ŠคํŠธ๋ฆผ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ, ๋ณ‘๋ ฌ ์ŠคํŠธ๋ฆผ์—์„œ๋Š” ์–ด๋–ค ์š”์†Œ๋“ ์ง€ ๋ฐ˜ํ™˜๋  ์ˆ˜ ์žˆ๋‹ค.
List numbers = Arrays.asList(1, 2, 3, 4, 5);

// 4 ๋ฐ˜ํ™˜  
Optional first = numbers.stream()  
.filter(n -> n > 3) // 3๋ณด๋‹ค ํฐ ์ˆ˜๋งŒ ํ•„ํ„ฐ๋ง  
.findFirst(); // ์ฒซ ๋ฒˆ์งธ ์š”์†Œ ๋ฐ˜ํ™˜

count()

์ŠคํŠธ๋ฆผ์—์„œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. filter()์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด๋„ ์ข‹๋‹ค.

List numbers = Arrays.asList(1, 2, 3, 4, 5);

int count = numbers.stream()  
.count(); // ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ ๊ฐœ์ˆ˜ ์„ธ๊ธฐ

int even = numbers.stream()  
.filter(n -> n % 2 == 0) // ์ง์ˆ˜๋งŒ ํ•„ํ„ฐ๋ง  
.count(); // ํ•„ํ„ฐ๋ง๋œ ์š”์†Œ์˜ ๊ฐœ์ˆ˜

Map์—์„œ Stream API๋ฅผ ์“ฐ๋Š” ๋ฒ•

Stream API๋Š” ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ๋ผ๊ณ  ํ–ˆ๋‹ค.
์ด ์ปฌ๋ ‰์…˜ ๋ฐ์ดํ„ฐ๋ž€, Collection interface๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋งํ•œ๋‹ค.
์—ฌ๊ธฐ์—” List, Set ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค.

๋‹ค๋งŒ List์™€ Set๋งŒํผ ์ž์ฃผ ์“ฐ๋Š” Map์€ ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค!
Collection Interface ์ค‘ Set์„ ํ™œ์šฉํ•œ๋‹ค.

Map์—์„œ ๋‚˜์˜ฌ ๋งŒํ•œ Set์€ key set, value set, entry set์ด๋‹ค. ๋ชจ๋‘ Map์— ๋‚ด์žฅ๋œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด Set ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋“ค๋กœ Stream API๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค.

  • keySet()
  • values()
  • entrySet()

๐Ÿ“‹ ์ฐธ๊ณ ์ž๋ฃŒ

์ฝ”๋“œ์ž‡ ์Šคํ”„๋ฆฐํŠธ ๊ฐ•์˜ ๋…ธํŠธ
์–‘์„ฑ์šฑ ๋‹˜์˜ ํฌ์ŠคํŒ…: [Java] Stream API

๋ฐ˜์‘ํ˜•