“์ฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ค๋ฃฐ ์ ์๋ค”๋ ์๋ฏธ
์๋ฐ์ Stream API๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ ํ ์ค๋ก ์ฒ๋ฆฌํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
์ฆ, ๋ฐฐ์ด(List, Set, Map ๋ฑ ์ปฌ๋ ์ )์ด๋ ํ์ผ, ์ ๋ ฅ ๋ฐ์ดํฐ ๋ฑ์ ์์ฐจ์ ์ผ๋ก ์ฝ๊ณ ๊ฐ๊ณตํ๋ ๊ณผ์ ์ ์ฝ๊ฒ ํ ์ ์๋๋ก ๋์์ค๋ค.
1. “์ฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ”์ด๋?
“๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ์์ ๋, ํ๋์ฉ ์ฒ๋ฆฌํ๋ ํ๋ฆ”์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ์ฐ๋ฆฌ๊ฐ List<Integer>๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ฉด:
์ผ๋ฐ์ ์ธ for๋ฌธ ๋ฐฉ์
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = new ArrayList<>();
for (int num : list) {
result.add(num * 2); // ๊ฐ ์์๋ฅผ 2๋ฐฐ๋ก ๋ณํ
}
System.out.println(result); // [2, 4, 6, 8, 10]
• ํ๋์ฉ ๋ฐ๋ณตํ๋ฉด์ ์ฒ๋ฆฌํด์ผ ํ๊ณ , result ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํด์ผ ํจ.
๐ ํ์ง๋ง Stream์ ์ฌ์ฉํ๋ฉด?
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = list.stream()
.map(num -> num * 2) // ์์๋ฅผ 2๋ฐฐ๋ก ๋ณํ
.collect(Collectors.toList()); // ๋ฆฌ์คํธ๋ก ๋ณํ
System.out.println(result); // [2, 4, 6, 8, 10]
• ๋ฐ์ดํฐ๊ฐ “์ฐ์์ ์ผ๋ก ํ๋ฅด๋ฏ์ด” ํ ์ค๋ก ์ฒ๋ฆฌ๋จ.
• map()์ ๊ฐ ์์๋ฅผ ๋ณํํ๋ ๊ณผ์ ์ด๊ณ , collect()๋ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌ์คํธ๋ก ์์ง.
2. ์ด๋ค ๊ฒฝ์ฐ์ Stream์ ์ฌ์ฉํ ๊น?
2.1 ๋ฐฐ์ด์ด๋ ์ปฌ๋ ์ ์ ๋ค๋ฃฐ ๋
๋ฐฐ์ด, List, Set, Map ๊ฐ์ ๋ฐ์ดํฐ ์งํฉ์ ํ ๋ฒ์ ๊ฐ๊ณตํด์ผ ํ ๋ ์ ์ฉํ๋ค.
์์ : ์ง์๋ง ํํฐ๋งํ๊ธฐ
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0) // ์ง์๋ง ๋จ๊ธฐ๊ธฐ
.collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4, 6]
โ filter() → ์กฐ๊ฑด์ ๋ง๋ ์์๋ง ๋จ๊น
โ collect() → ๋ฆฌ์คํธ๋ก ๋ณํ
2.2. ์ ๋ ฌ์ ๊ฐํธํ๊ฒ ํ ๋
๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ๋ฅผ ์ ๋ ฌํ ๋๋ Stream์ด ์ ์ฉํ๋ค.
์์ : ์ซ์ ์ ๋ ฌํ๊ธฐ
int[] arr = {5, 2, 9, 1, 3};
int[] sortedArr = Arrays.stream(arr)
.sorted() // ์ ๋ ฌ
.toArray(); // ๋ฐฐ์ด๋ก ๋ณํ
System.out.println(Arrays.toString(sortedArr)); // [1, 2, 3, 5, 9]
โ sorted() → ์ ๋ ฌ ์ํ
โ toArray() → ๋ค์ ๋ฐฐ์ด๋ก ๋ณํ
3.3 ๋ฐ์ดํฐ ๋ณํ (Mapping)
๊ฐ ์์๋ฅผ ๋ณํํ ๋๋ Stream์ด ๊ฐ๋ ฅํ๋ค.
์์ : ๋ชจ๋ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๊ธฐ
List<Integer> numbers = Arrays.asList(1, 2, 3);
List<String> stringNumbers = numbers.stream()
.map(n -> "Number: " + n) // ๋ฌธ์์ด ๋ณํ
.collect(Collectors.toList());
System.out.println(stringNumbers); // [Number: 1, Number: 2, Number: 3]
โ map() → ์์๋ฅผ ๋ณํํ๋ ํจ์
3.4 ๋ฐ์ดํฐ ์ง๊ณ (sum, count, average ๋ฑ)
์์ : ํ๊ท ๊ฐ ๊ตฌํ๊ธฐ
List<Integer> numbers = Arrays.asList(10, 20, 30, 40);
double avg = numbers.stream()
.mapToInt(n -> n) // IntStream์ผ๋ก ๋ณํ
.average() // ํ๊ท ๊ณ์ฐ
.orElse(0); // ๊ฐ์ด ์์ ๊ฒฝ์ฐ 0 ๋ฐํ
System.out.println(avg); // 25.0
โ mapToInt() → Stream<Integer>๋ฅผ IntStream์ผ๋ก ๋ณํ
โ average() → ํ๊ท ๊ฐ ๋ฐํ
โ orElse(0) → ๊ฐ์ด ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ๊ฐ ์ค์
3.5. ์ต๋/์ต์๊ฐ ์ฐพ๊ธฐ
์์ : ์ต๋๊ฐ ์ฐพ๊ธฐ
List<Integer> numbers = Arrays.asList(3, 6, 2, 8, 5);
int max = numbers.stream()
.mapToInt(n -> n) // IntStream ๋ณํ
.max() // ์ต๋๊ฐ ์ฐพ๊ธฐ
.orElse(-1); // ๊ฐ์ด ์์ ๊ฒฝ์ฐ -1 ๋ฐํ
System.out.println(max); // 8
โ max() → ์ต๋๊ฐ ๋ฐํ
โ orElse(-1) → ๊ฐ์ด ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ ์ค์
3.6 ์ค๋ณต ์ ๊ฑฐ
์์ : ์ค๋ณต๋ ๊ฐ ์ ๊ฑฐํ๊ธฐ
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4, 5);
List<Integer> distinctNumbers = numbers.stream()
.distinct() // ์ค๋ณต ์ ๊ฑฐ
.collect(Collectors.toList());
System.out.println(distinctNumbers); // [1, 2, 3, 4, 5]
โ distinct() → ์ค๋ณต ์์ ์ ๊ฑฐ
3. Stream์ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์
1. ํ ๋ฒ ์ฌ์ฉํ Stream์ ๋ค์ ์ฌ์ฉํ ์ ์์!
Stream<Integer> stream = Arrays.asList(1, 2, 3).stream();
stream.forEach(System.out::println); // ๊ฐ๋ฅ
stream.forEach(System.out::println); // ERROR! (Stream์ 1ํ์ฑ)
๐ ํด๊ฒฐ์ฑ : ์๋ก Stream์ ๋ง๋ค์ด ์ฌ์ฉํด์ผ ํจ.
2. ์ฑ๋ฅ ์ต์ ํ ํ์
• ๋ณ๋ ฌ ์คํธ๋ฆผ (parallelStream())์ ์ฌ์ฉํ๋ฉด ๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์๋๊ฐ ํฅ์๋จ.
list.parallelStream().map(n -> n * 2).collect(Collectors.toList());
๐ ๋จ, ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๊ฒฝ์ฐ CPU ์ฝ์ด ์์ ์ฑ๋ฅ์ ๊ณ ๋ คํด์ผ ํจ.
3. Stream์ ๋ด๋ถ์ ์ผ๋ก ๋ฐ๋ณต์ ์ํํ์ง๋ง, ๋ช ์์ ์ธ ๋ฐ๋ณต(for๋ฌธ)๋ณด๋ค ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์๋ ์์.
โ ๊ฐ๋จํ ์ฐ์ฐ → Stream ์ฌ์ฉ
โ ๋ณต์กํ ์ฐ์ฐ → for๋ฌธ์ด ๋ ๋ช ํํ ์๋ ์์.
์ ๋ฆฌ: Stream์ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น?
์ํฉ์ ํต์ ์ธ for๋ฌธStream ์ฌ์ฉ
๋ฐ์ดํฐ ํํฐ๋ง | if๋ฌธ์ผ๋ก ๊ฑธ๋ฌ์ผ ํจ | filter() |
๋ฐ์ดํฐ ๋ณํ | ์ง์ ๋ณํ ํ ์ ์ฅ | map() |
์ ๋ ฌ | Arrays.sort() ๋ฑ ํ์ | sorted() |
๋ฆฌ์คํธ ๋ณํ | ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ถ๊ฐ | collect() |
ํฉ๊ณ, ํ๊ท | for๋ฌธ์ ๋๋ฉฐ ๊ณ์ฐ | sum(), average() |
โ ๋ฐ๋ณต๋ฌธ์ ์ค์ด๊ณ ํ ์ค๋ก ๊น๋ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด Stream ์ฌ์ฉ!
โ ๋ฐ์ดํฐ๋ฅผ ๋ณํ, ํํฐ๋ง, ์ ๋ ฌ, ์ง๊ณํ ๋ ๋งค์ฐ ์ ์ฉ!
์ต์ข ๊ฒฐ๋ก
์ฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ์ด๋ ๋ฐฐ์ด, ๋ฆฌ์คํธ ๋ฑ์ ๋ฐ์ดํฐ ์งํฉ์ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ณผ์ .
Stream API๋ฅผ ์ฌ์ฉํ๋ฉด ํํฐ๋ง, ๋ณํ, ์ ๋ ฌ, ์ง๊ณ๋ฅผ ์ฝ๊ฒ ํ ์ ์์.
์ฝ๋๊ฐ ์งง๊ณ ์ง๊ด์ ์ด์ง๋ง, ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์๋ ํน์ง์ด ์์.
์ ์ ํ ๊ฒฝ์ฐ for๋ฌธ๋ณด๋ค Stream์ด ๋ ํจ์จ์ ์ผ ์ ์์.
์ฆ, ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ๋ Stream์ ์ฌ์ฉํ๋ฉด ์ข๋ค!