Collection ๊ฐ๊ฐ์ ์์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋์
Java 8์ Stream
Stream์ ๋ฑ์ฅ ์ด์ : Collection ๊ฐ๊ฐ์ ์์์ ๋ํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ๋์ ํ์
Stream์ Java 8์์ ๋์ ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ๋๊ตฌ๋ก, ๊ธฐ์กด ์ปฌ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ์์ ํ๊ณ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค.
๊ธฐ์กด์๋ for, while ๊ฐ์ ์ธ๋ถ ๋ฐ๋ณต์ ์ฌ์ฉํด ์ปฌ๋ ์ ์์๋ฅผ ์ฒ๋ฆฌํ์ง๋ง, Stream์ ์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ ๋ด๋ถ์์ ์ํํ์ฌ ๋ ๊ฐ๊ฒฐํ๊ณ ์ ์ฐํ๊ฒ ๋ง๋ ๋ค.
- ์ธ๋ถ ๋ฐ๋ณต: ๋ฃจํ๋ฅผ ํตํด ์ธ๋ถ์์ ์ปฌ๋ ์ ์์๋ฅผ ์ฒ๋ฆฌ.
- ๋ด๋ถ ๋ฐ๋ณต: Stream์ ์ฌ์ฉํด ๋ด๋ถ์์ ์ปฌ๋ ์ ์์๋ฅผ ์ฒ๋ฆฌ.
- Stream ์ด์ ์ ์๋ฐ ์ปฌ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ์ (์ธ๋ถ ๋ฐ๋ณต):
for (String string : list) {
if (string.contains("a")) {
return true;
}
}
- Stream์ด ๋ฑ์ฅํ๊ธฐ ์ ์ ์๋ฐ์์๋ `for` ๋ฌธ๋ฒ์ ํตํด ์ดํฐ๋ ์ด์ .
- Stream์ ์ฌ์ฉํ ์ปฌ๋ ์ ์ฒ๋ฆฌ ๋ฐฉ์(๋ด๋ถ ๋ฐ๋ณต):
boolean isExist = list.stream().anyMatch(element -> element.contains("a"));
- Stream์ด ๋ฑ์ฅํ ํ์๋ ๊ฐ๋จํ๊ฒ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ(ํจ์ํ ์ธ์)์ผ๋ก ๋ด๋ถ ์ดํฐ๋ ์ด์ .
Stream: Collection ๊ฐ๊ฐ ์์์ ๋ํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ฒ๋ฆฌ ๋จ์
Stream์ ์ปฌ๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋๋ก ํ๋ ๊ฐ์ฒด์ด๋ค. ์ด๋ฅผ ํตํด ์ปฌ๋ ์ ๋ด ์์๋ค์ ๊ฐ๊ฒฐํ๊ฒ ๋ณํ, ํํฐ๋ง, ์ง๊ณ ๋ฑ์ ์์ ์ ์ํํ ์ ์๋ค.
- ๋ณ์ ์ ์ธ: Stream<String>: Generic ์ ๋ค๋ฆญ์ ํตํด ์ด๋ค ํ์ ์ ์์๋ฅผ ๊ฐ์ง ์ ์๋์ง ๋ช ์
- ๊ฐ์ฒด ์์ฑ: Array๋ก ๋ถํฐ Stream ์์ฑ / List๋ก ๋ถํฐ Stream ์์ฑ / Stream ์ง์ ์์ฑ
1. Array๋ก ๋ถํฐ Stream ์์ฑ
String[] arr = new String[]{"a", "b", "c"};
Stream<String> stream = Arrays.stream(arr);
2. List๋ก ๋ถํฐ Stream ์์ฑ(๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ๋ฐฉ์)
List<String> lists = Arrays.asList("a", "b", "c");
Stream<String> stream = lists.stream();
3. Stream ์ง์ ์์ฑ
Stream<String> stream = Stream.of("a", "b", "c");
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์์ Stream์ ์ฅ์
- ์ ์ธํ: ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ ๋๊ฒ ์์ฑํ ์ ์๋ค.
- ์กฐ๋ฆฝ ๊ฐ๋ฅ: ์ฌ๋ฌ ์ฐ์ฐ์ ์ฒด์ธ์ฒ๋ผ ์ฐ๊ฒฐํ ์ ์์ด ์ ์ฐ์ฑ ์ฆ๊ฐ
- ๋ณ๋ ฌํ: ๊ฐ๋จํ ์ค์ ์ผ๋ก ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํด ์ฑ๋ฅ์ด ํฅ์.
Stream ์ฌ์ฉ
Stream์์์ ์ฐ์ฐ์ Intermediate Operations(์ค๊ฐ ์ฐ์ฐ)๊ณผ Terminal Operations(์ข ๋ฃ ์ฐ์ฐ) ๋ก ๋๋ ์ ์๋ค.
Intermediate Operations(์ค๊ฐ ์ฐ์ฐ)
์ค๊ฐ ์ฐ์ฐ์ Stream์ ๋ฐํํ์ฌ ๊ณ์ํด์ ์ฒด์ด๋ํ ์ ์๋ค.
- Mapping(`.map()`): ๊ฐ ์์๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํํ๋ค. ํ์ ๋ณํ๋ ๊ฐ๋ฅํ๋ค.
List<String> names = Arrays.asList("John", "Jane", "Jack");
List<Integer> nameLengths = names.stream()
.map(String::length)
.collect(Collectors.toList()); // [4, 4, 4]
- Filtering (`.filter()`): ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๋ค๋ง ํํฐ๋งํ์ฌ ๋จ๊ธด๋ค.
List<String> filteredNames = names.stream()
.filter(name -> name.startsWith("J"))
.collect(Collectors.toList()); // ["John", "Jane", "Jack"]
Terminal Operations(์ข ๋ฃ ์ฐ์ฐ)
์ข ๋ฃ ์ฐ์ฐ์ Stream์ ์ข ๋ฃํ๊ณ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
Matching:
- `.anyMatch()`: ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๊ฐ ํ๋๋ผ๋ ์๋์ง ํ์ธํ๋ค.
boolean hasJane = names.stream().anyMatch(name -> name.equals("Jane"));
- `.allMatch()`: ๋ชจ๋ ์์๊ฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋์ง ํ์ธํ๋ค.
boolean allNamesStartWithJ = names.stream().allMatch(name -> name.startsWith("J"));
- `.noneMatch()`: ์กฐ๊ฑด์ ๋ง์กฑํ๋ ์์๊ฐ ์๋์ง ํ์ธํ๋ค.
boolean noNamesWithZ = names.stream().noneMatch(name -> name.contains("Z"));
Reduction:
- `.reduce()`: ์ฌ๋ฌ ์์๋ฅผ ํ๋๋ก ํฉ์ณ ๋จ์ผ ๊ฐ์ ๋ฐํํ๋ค.
int sum = Arrays.asList(1, 2, 3, 4).stream().reduce(0, Integer::sum);
Collecting
- `.collect()`: ์์๋ค์ Collection์ผ๋ก ๋ณํํ์ฌ ๋ฐํํ๋ค.
List<String> collectedNames = names.stream().collect(Collectors.toList());
Stream ํ์ฉ
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
int sum = numbers.stream()
.filter(n -> n % 2 == 0) // ์ง์๋ง ํํฐ๋ง
.mapToInt(n -> n * 2) // 2๋ฐฐ๋ก ๋ณํ
.sum(); // ํฉ๊ณ ๊ณ์ฐ
์ ์์ ์ฝ๋๋ ์ง์๋ง ํํฐ๋งํ๊ณ 2๋ฐฐ๋ก ๋ณํํ ํ, ๊ทธ ๊ฐ๋ค์ ํฉ๊ณ๋ฅผ ๊ตฌํ๋ ๊ฐ๋จํ ํ์ฉ๋ฒ์ด๋ค.
Java 9์์ ์ถ๊ฐ๋ Stream ๋ฉ์๋
1. takeWhile(): ์กฐ๊ฑด์ ๋ง์กฑํ ๋๊น์ง ์์๋ฅผ ๊ฐ์ ธ์จ๋ค.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
.takeWhile(n -> n < 4)
.collect(Collectors.toList()); // [1, 2, 3]
2. dropWhile(): ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋์ ์์๋ฅผ ๋ฒ๋ฆฌ๊ณ , ์ดํ์ ์์๋ง์ ๊ฐ์ ธ์จ๋ค.
List<Integer> result = numbers.stream()
.dropWhile(n -> n < 4)
.collect(Collectors.toList()); // [4, 5]
3. iterate(): ์ด๊ธฐ๊ฐ๊ณผ ์กฐ๊ฑด์ ํจ๊ป ์ฌ์ฉํ์ฌ ๋ฐ๋ณต์ ์ธ Stream์ ์์ฑํ ์ ์๋ค.
Stream<Integer> stream = Stream.iterate(1, n -> n < 10, n -> n + 1);
stream.forEach(System.out::println); // 1๋ถํฐ 9๊น์ง ์ถ๋ ฅ
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java]JDBC Driver (0) | 2024.12.10 |
---|---|
[Java] Optional (1) | 2024.10.02 |
[Java] SOLID ์์น (1) | 2024.10.02 |
[Java] Enum (0) | 2024.10.01 |
[Java] Interface / Abstract Class (1) | 2024.10.01 |