Skip to content

Commit

Permalink
GITBOOK-192: No subject
Browse files Browse the repository at this point in the history
  • Loading branch information
GoldenPearls authored and gitbook-bot committed Nov 13, 2024
1 parent 108516b commit 009d430
Show file tree
Hide file tree
Showing 2 changed files with 211 additions and 0 deletions.
1 change: 1 addition & 0 deletions developLog/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
* [item 42 : 읡λͺ… ν΄λž˜μŠ€λ³΄λ‹€λŠ” λžŒλ‹€λ₯Ό μ‚¬μš©ν•˜λΌ](programming-lanuage/java/effective-java/7/item-42.md)
* [item 43 : λžŒλ‹€λ³΄λ‹€λŠ” λ©”μ„œλ“œ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜λΌ](programming-lanuage/java/effective-java/7/item-43.md)
* [item 44 : ν‘œμ€€ ν•¨μˆ˜ν˜• μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λΌ](programming-lanuage/java/effective-java/7/item-44.md)
* [item 45 : μŠ€νŠΈλ¦Όμ€ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•˜λΌ](programming-lanuage/java/effective-java/7/item-45.md)
* [μŠ€ν„°λ””μ—μ„œ μ•Œμ•„κ°€λŠ” 것](programming-lanuage/java/effective-java/undefined.md)
* [λͺ¨λ˜ μžλ°” 인 μ•‘μ…˜](programming-lanuage/java/modern-java-in-action/README.md)
* [chaper 1. μžλ°” 8, 9, 10, 11 : 무슨 일이 μΌμ–΄λ‚˜κ³  μžˆλŠ”κ°€?](programming-lanuage/java/modern-java-in-action/chaper-1.-8-9-10-11.md)
Expand Down
210 changes: 210 additions & 0 deletions developLog/programming-lanuage/java/effective-java/7/item-45.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,210 @@
# item 45 : μŠ€νŠΈλ¦Όμ€ μ£Όμ˜ν•΄μ„œ μ‚¬μš©ν•˜λΌ

μŠ€νŠΈλ¦Όμ΄λž€ μžλ°” 8λΆ€ν„° **λ‹€λŸ‰μ˜ 데이터 처리 μž‘μ—…**(순차/병렬)을 λ•κ³ μž λ‚˜μ˜¨ API이며, 두 가지 핡심적인 좔상 κ°œλ…μ„ μ œκ³΅ν•œλ‹€.

μŠ€νŠΈλ¦Όμ€ μ›ν•˜λŠ” κ²°κ³Όλ₯Ό μƒμ„±ν•˜κΈ° μœ„ν•΄ νŒŒμ΄ν”„λΌμΈμœΌλ‘œ 연결될 수 μžˆλŠ” λ‹€μ–‘ν•œ λ©”μ„œλ“œλ₯Ό μ§€μ›ν•˜λŠ” 개체 μ‹œν€€μŠ€μ΄λ‹€. λ°μ΄ν„°μ˜ 흐름, 즉 슀트림이 ν˜λŸ¬κ°€λŠ” κ³Όμ •μ—μ„œ 데이터가 순차적으둜 ν•˜λ‚˜μ”© μ‚¬μš©λ˜κ³  사라진닀.

λŒ€μš©λŸ‰ 데이터λ₯Ό μ²˜λ¦¬ν•  λ•Œ νš¨μœ¨μ„ 높이기 μœ„ν•΄, μ˜€ν† λ°•μ‹±/μ–Έλ°•μ‹± 과정이 ν•„μš” μ—†λŠ” `Intstream` κ³Ό 같은 κΈ°λ³Έν˜• μŠ€νŠΈλ¦Όλ„ μ œκ³΅ν•œλ‹€.

> πŸ”– **슀트림의 좔상 κ°œλ…**\
> 1\. 슀트림(stream) : 데이터 μ›μ†Œμ˜ μœ ν•œ ν˜Ήμ€ λ¬΄ν•œ μ‹œν€€μŠ€\
> 2\. 슀트림 νŒŒμ΄ν”„λΌμΈ(stream pipeline) : 이 μ›μ†Œλ“€λ‘œ μˆ˜ν–‰ν•˜λŠ” μ—°μ‚° 단계λ₯Ό ν‘œν˜„
#### ☁️ 슀트림 νŒŒμ΄ν”„λΌμΈ <a href="#undefined" id="undefined"></a>

![](https://velog.velcdn.com/images/semi-cloud/post/8f2e7dd2-405b-4653-bc32-9269a0f7cc59/image.png)

**슀트림 νŒŒμ΄ν”„λΌμΈ μ—°μ‚°**

슀트림 νŒŒμ΄ν”„λΌμΈμ€ μ†ŒμŠ€ μŠ€νŠΈλ¦Όμ—μ„œ μ‹œμž‘ν•΄ 쒅단 μ—°μ‚°μœΌλ‘œ λλ‚˜λ©°, κ·Έ 사이에 ν•˜λ‚˜ μ΄μƒμ˜ 쀑간 연산이 μžˆμ„ 수 μžˆλ‹€.

**1. 쀑간 μ—°μ‚°(Intermediate Operation)**\
각 쀑간 연산은 **μŠ€νŠΈλ¦Όμ„ μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ λ³€ν™˜**ν•˜λŠ” 역할을 μˆ˜ν–‰ν•˜λ©°, λͺ¨λ‘ ν•œ μŠ€νŠΈλ¦Όμ„ λ‹€λ₯Έ 슀트림으둜 λ³€ν™˜ν•˜κ²Œ ν•˜μ—¬ λ©”μ„œλ“œ 체이닝을 κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€. 예λ₯Ό λ“€μ–΄, 각 μ›μ†Œμ— ν•¨μˆ˜λ₯Ό μ μš©ν•˜κ±°λ‚˜ νŠΉμ • 쑰건을 만쑱 λͺ»ν•˜λŠ” μ›μ†Œλ₯Ό κ±ΈλŸ¬λ‚Ό 수 μžˆλ‹€.

* `filter()`, `map()`, `sorted()`

**2. 쒅단 μ—°μ‚°(Terminal Operation)**\
쒅단 연산은 λ§ˆμ§€λ§‰ 쀑간 연산이 내놓은 **μŠ€νŠΈλ¦Όμ— μ΅œν›„μ˜ 연산을 κ°€ν•˜λŠ”** 역할을 ν•œλ‹€. 예λ₯Ό λ“€μ–΄, μ›μ†Œλ₯Ό μ •λ ¬ν•΄ μ»¬λ ‰μ…˜μ— λ‹΄κ±°λ‚˜ νŠΉμ • μ›μ†Œλ₯Ό ν•˜λ‚˜ μ„ νƒν•˜λŠ” 식이닀.

* `forEach()`, `collect()`, `match()`, `count()`, `reduce()`

```java
List<Integer> transactionsIds =
transactions.stream()
.filter(t -> t.getType() == Transaction.GROCERY)
.sorted(comparing(Transaction::getValue).reversed())
.map(Transaction::getId)
.collect(toList());
```

![](https://velog.velcdn.com/images/semi-cloud/post/7f73e3a6-941c-4c4d-af7e-b3a19d1b921e/image.png)

[https://www.geeksforgeeks.org/java-8-stream-tutorial/](https://www.geeksforgeeks.org/java-8-stream-tutorial/)

#### ☁️ 슀트림 νŒŒμ΄ν”„λΌμΈ νŠΉμ§• <a href="#undefined" id="undefined"></a>

**1. 지연 평가(lazy evaluation)**

λ¨Όμ € μ§€μ—°μ΄λž€ **결과값이 ν•„μš”ν• λ•ŒκΉŒμ§€ 계산을 λŠ¦μΆ”λŠ”** 기법을 μ˜λ―Έν•œλ‹€. μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μ–΄λŠ λΆ€λΆ„μ—μ„œ κ°€μž₯ 큰 이읡을 얻을 수 μžˆμ„κΉŒ?

> λŒ€μš©λŸ‰μ˜ λ°μ΄ν„°μ—μ„œ, **μ‹€μ œλ‘œ ν•„μš”ν•˜μ§€ μ•Šμ€ 데이터듀을 νƒμƒ‰ν•˜λŠ” 것을 방지**ν•΄ 속도λ₯Ό 높일 수 μžˆλ‹€. 즉, 쒅단 연산에 쓰이지 μ•ŠλŠ” 데이터 μ›μ†ŒλŠ” 계산 μžμ²΄μ— 쓰이지 μ•ŠλŠ”λ‹€. 그리고 이것을 `Short-Circuit` 방식이라 λΆ€λ₯Έλ‹€.
![](https://velog.velcdn.com/images/semi-cloud/post/46a80a05-ff1a-4ab6-9e43-88aadb31e8cc/image.png)\
[https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html](https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html)

슀트림 νŒŒμ΄ν”„λΌμΈμ„ μ‹€ν–‰ν•˜κ²Œ 되면, `JVM` 은 κ³§λ°”λ‘œ 슀트림 연산을 μ‹€ν–‰μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€. μ΅œμ†Œν•œμœΌλ‘œ ν•„μˆ˜μ μΈ μž‘μ—…λ§Œ μˆ˜ν–‰ν•˜κ³ μž 검사λ₯Ό λ¨Όμ € ν•˜κ³ , 이λ₯Ό λ°”νƒ•μœΌλ‘œ μ΅œμ ν™” 방법을 μ°Ύμ•„λ‚΄ κ³„νšν•œλ‹€. 그리고 κ·Έ κ³„νšμ— 따라 κ°œλ³„ μš”μ†Œμ— λŒ€ν•œ 슀트림 연산을 μˆ˜ν–‰ν•œλ‹€.

예λ₯Ό λ“€μ–΄, `10000` 개의 데이터쀑에 길이가 5κ°€ λ„˜λŠ” λ¬Έμžμ—΄μ—μ„œ κ°€μž₯ μ•ŒνŒŒλ²³μˆœμœΌλ‘œ μ•žμ— μžˆλŠ” 2개의 λ¬Έμžμ—΄λ§Œ 가지고 였고 μ‹Άλ‹€κ³  ν•˜μž. 지연 평가가 없이 μˆœμ„œλŒ€λ‘œ λ°”λ‘œ λ™μž‘ν–ˆλ‹€λ©΄, `10000` 개의 데이터λ₯Ό λͺ¨λ‘ μˆœνšŒν•΄μ•Ό ν–ˆμ„ 것이닀.

ν•˜μ§€λ§Œ μ–΄μ§œν”Ό μ΅œμ’…μ μœΌλ‘œ 2개만 νƒμƒ‰ν•˜λ©΄ λ˜λŠ”λ° 전체 데이터λ₯Ό λ‹€ λ³Ό ν•„μš”κ°€ μžˆμ„κΉŒ?

1. `limit` μ‚¬μš© O\
![](https://velog.velcdn.com/images/semi-cloud/post/d762d983-e0dd-4f8f-a535-c7fef2c58483/image.png)
2. `limit` μ‚¬μš© X\
![](https://velog.velcdn.com/images/semi-cloud/post/ee8b44f3-0172-4b03-bcd6-f3979d65f342/image.png)

κ²°κ³Όλ₯Ό 봐보자. `limit(n)` 연산이 λ‚΄λΆ€μ μœΌλ‘œ μžμ‹ μ—κ²Œ λ„λ‹¬ν•œ μš”μ†Œκ°€ `n` κ°œκ°€ λ˜μ—ˆμ„ λ•Œ 슀트림 λ‚΄ λ‹€λ₯Έ μš”μ†Œλ“€μ— λŒ€ν•΄ 더 이상 μˆœνšŒν•˜μ§€ μ•Šκ³  νƒˆμΆœν•˜λ„λ‘ λ§Œλ“€μ—ˆκΈ° λ•Œλ¬Έμ—, 길이가 `5`κ°€ λ„˜λŠ” 데이터 `4` κ°œκ°€ μ•„λ‹Œ, 맨 μ•žμ— `2` 개 데이터가 좜λ ₯된 것을 λ³Ό 수 μžˆλ‹€.\
![](https://velog.velcdn.com/images/semi-cloud/post/bc56f393-72aa-492e-b91c-c14269478d0e/image.png)

**μ˜ˆμ™Έ 사항: Stateful operations**

μ΄λŸ¬ν•œ 지연 평가 νŠΉμ„±μœΌλ‘œ 인해, μš°λ¦¬λŠ” **λ¬΄ν•œ 슀트림**을 λ‹€λ£° 수 있게 λœλ‹€.

λ¬΄ν•œ μŠ€νŠΈλ¦Όμ€ μ• μ΄ˆμ— 크기가 μ •ν•΄μ Έ μžˆμ§€ μ•Šμ€ 만큼, 쀑볡 제거λ₯Ό ν•˜μ§€ λͺ»ν•œλ‹€ . ν•˜μ§€λ§Œ `limit()` κ³Ό 같은 `short-circuit` 연산을 톡해 μœ ν•œ 슀트림으둜 λ³€ν™€ν•¨μœΌλ‘œμ¨ κ°€λŠ₯해진닀.

> πŸ”– **μœ ν•œ 슀트림 vs λ¬΄ν•œ 슀트림**\
> 1\. μœ ν•œ 슀트림 : 생성할 λ•Œ 크기가 μ •ν•΄μ Έ μžˆλŠ” 슀트림
>
> ```java
> IntStream ints(long streamsize, int begin, int end)
> ```
>
> 2.λ¬΄ν•œ 슀트림 : λ¬΄ν•œν•œ 크기둜 값을 κ°€μ§€λŠ” 슀트림
>
> ```java
> IntStream ints(int begin, int end)
> ```
이처럼 쀑볡을 μ œκ±°ν•˜λŠ” `distinct()` λ‚˜, 전체 데이터λ₯Ό μ •λ ¬ν•˜λŠ” `sort()` 연산듀을 `Stateful` 연산이라 ν•œλ‹€. ν•˜μ§€λ§Œ μ΄λŠ” 지연 평가λ₯Ό λ¬΄νš¨ν™”μ‹œν‚€κ³ , κ²°κ³Όλ₯Ό μƒμ„±ν•˜κΈ° 전에 전체 데이터λ₯Ό νƒμƒ‰ν•˜λŠ” κ²°κ³Όλ₯Ό μ΄ˆλž˜ν•œλ‹€. μ˜ˆμ‹œλ₯Ό 봐보자.
![](https://velog.velcdn.com/images/semi-cloud/post/7b5a3dc1-fcb6-497c-9976-71acf246605e/image.png)
`limit()` 을 κ±Έμ–΄μ£Όμ—ˆμŒμ—λ„, `sorted()` 으둜 인해 길이가 `5`κ°€ λ„˜λŠ” λͺ¨λ“  λ„€κ°œμ˜ 데이터듀을 탐색할 ν•„μš”κ°€ 생겨 지연 평가가 이루어지지 μ•Šμ€ 것을 λ³Ό 수 μžˆλ‹€.
![](https://velog.velcdn.com/images/semi-cloud/post/e60f5506-cedb-4c8c-8b13-ee1318496f19/image.png)
**2. μˆœμ°¨μ„±**
기본적으둜 슀트림 νŒŒμ΄ν”„λΌμΈμ€ 순차적으둜 μˆ˜ν–‰λœλ‹€. νŒŒμ΄ν”„λΌμΈμ„ λ³‘λ ¬λ‘œ μ‹€ν–‰ν•˜λ €λ©΄, νŒŒμ΄ν”„λΌμΈμ„ κ΅¬μ„±ν•˜λŠ” 슀트림 쀑 ν•˜λ‚˜μ—μ„œ `parallel` λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ˜λ‚˜, 효과λ₯Ό λ³Ό 수 μžˆλŠ” 상황은 λ§Žμ§€ μ•Šλ‹€.
#### ☁️ λ°˜λ³΅λ¬Έμ„ 슀트림으둜 무쑰건 λ°”κΎΈλŠ”κ²ƒμ΄ μ’‹μ„κΉŒ? <a href="#undefined" id="undefined"></a>
μŠ€νŠΈλ¦Όμ„ μ œλŒ€λ‘œ μ‚¬μš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ 짧고 κΉ”λ”ν•΄μ§€μ§€λ§Œ, 잘λͺ» μ‚¬μš©ν•˜λ©΄ 읽기 μ–΄λ ΅κ³  μœ μ§€λ³΄μˆ˜κ°€ νž˜λ“€λ‹€. κ·Έλ ‡λ‹€λ©΄ 방법은?
**1. λͺ¨λ“  λ°˜λ³΅λ¬Έμ„ 슀트림으둜 λ°”κΎΈκΈ° 보닀, 반볡문과 μŠ€νŠΈλ¦Όμ„ 적절히 μ‘°ν•©ν•˜μž.**
λ‹€μŒ μ½”λ“œμ˜ μ˜ˆμ‹œλ₯Ό λ“€μ–΄ μ„€λͺ…해보겠닀. 이 ν”„λ‘œκ·Έλž¨μ€, 사전 νŒŒμΌμ—μ„œ 단어λ₯Ό 읽어 μ‚¬μš©μžκ°€ μ§€μ •ν•œ 문턱값보닀 μ›μ†Œ μˆ˜κ°€ λ§Žμ€ μ•„λ‚˜κ·Έλž¨ 그룹을 좜λ ₯ν•œλ‹€. (철자λ₯Ό κ΅¬μ„±ν•˜λŠ” μ•ŒνŒŒλ²³μ΄ κ°™κ³  μˆœμ„œλ§Œ λ‹€λ₯Έ 단어)
```java
public class Anagrams {
public static void main(String[] args) throws IOException {
File dictionary = new File(args[0]);
int minGroupSize = Interger.parseInt(args[1]);
Map<String, Set<String>> groups = new HashMap<>();
try(Scanner s = new Scanner(dictionary)){
while(s.hasNext()){
String word = s.next();
groups.computeIfAbsent(alphabetize(word), (unused) -> new TreeSet<>()).add(word);
}
}
for(Set<String> group : groups.values())
if(group.size() >= minGroupSize)
System.out.println(group.size() + ":" + group);
}
public static String alphabetie(String s){
char[] a = s.toCharArray();
Arrays.sort(a);
return new String(a);
}
}
```
* `computeIfAbsent()` : 맡 μ•ˆμ— ν‚€κ°€ μžˆλ‹€λ©΄ λ§€ν•‘λœ 값을 λ°˜ν™˜ν•˜κ³  μ—†λ‹€λ©΄ 건넀진 ν•¨μˆ˜ 객체λ₯Ό 킀에 μ μš©ν•˜μ—¬ 값을 κ³„μ‚°ν•œ λ‹€μŒ 킀와 값을 맀핑해놓고, κ³„μ‚°λœ 값을 λ°˜ν™˜
```java
try (Stream<String> words = Files.lines(dictionary)) {
words.collect(
groupingBy(word -> word.chars().sorted()
.collect(StringBuilder::new,
(sb, c) -> sb.append((char) c),
StringBuilder::append).toString()))
.values().stream()
.filter(group -> group.size() >= minGroupSize)
.map(group -> group.size() + ": " + group)
.forEach(System.out::println);
}
}
}
```
μŠ€νŠΈλ¦Όμ„ κ³Όν•˜κ²Œ ν™œμš©ν•˜μ—¬, 사전 파일 μ—¬λŠ” 뢀뢄을 μ œμ™Έν•˜κ³  ν”„λ‘œκ·Έλž¨ 전체가 단 ν•˜λ‚˜μ˜ ν‘œν˜„μ‹μœΌλ‘œ 처리되고 μžˆλ‹€. 이처럼 μŠ€νŠΈλ¦Όμ„ κ³Όμš©ν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ½κ±°λ‚˜ μœ μ§€λ³΄μˆ˜ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.
**μŠ€νŠΈλ¦Όμ„ μ μ ˆν•˜κ²Œ ν™œμš©ν•˜κΈ°**
```java
try (Stream<String> words = Files.lines(dictionary)) {
words.collect(groupingBy(word -> alphabetize(word)))
.values().stream()
.filter(group -> group.size() >= minGroupSize)
.forEach(g -> System.out.println(g.size() + ": " + g));
}
```
`alphabetize()` κ³Ό 같은 μ„ΈλΆ€ κ΅¬ν˜„μ€ μ£Ό ν”„λ‘œκ·Έλž¨ 둜직 λ°–μœΌλ‘œ λΉΌλ‚΄ 전체적인 가독성을 λ†’μ˜€λ‹€. 이처럼 λ„μš°λ―Έ λ©”μ„œλ“œλ₯Ό 적절히 ν™œμš©ν•˜λŠ” 일의 μ€‘μš”μ„±μ€ 일반 반볡 μ½”λ“œμ—μ„œλ³΄λ‹€λŠ” 슀트림 νŒŒμ΄ν”„λΌμΈμ—μ„œ 훨씬 컀진닀.
> πŸ”– λžŒλ‹€μ—μ„œλŠ” νƒ€μž… 이름을 자주 μƒλž΅ν•˜λ―€λ‘œ, λ§€κ°œλ³€μˆ˜μ˜ 이름을 잘 지어야 슀트림 νŒŒμ΄ν”„λΌμΈμ˜ 가독성이 μœ μ§€ν•  수 μžˆλ‹€.
**2.char 값을 μ²˜λ¦¬ν•  λ•ŒλŠ” μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜μ§€ 말자.**
μžλ°”λŠ” κΈ°λ³Έ νƒ€μž…μΈ `char` 용 μŠ€νŠΈλ¦Όμ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€. λ”°λΌμ„œ μ•„λž˜ μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œμΌœλ³΄λ©΄ μ •μˆ˜κ°’μ΄ 좜λ ₯λœλ‹€. 참고둜 `boolean[]`, `byte[]`, `short[]`, `char[]`, `float[]` 도 ν•΄λ‹Ή νƒ€μž…μ˜ κΈ°λ³Έν˜• 슀트림이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
```java
"Hello World!".chars().forEach(System.out::print); // μ •μˆ˜κ°’μ΄ 좜λ ₯됨 : 739488237102..
```
#### ☁️ 슀트림의 μ μ ˆν•œ ν™œμš© <a href="#undefined" id="undefined"></a>
슀트림 νŒŒμ΄ν”„λΌμΈμ€ λ˜ν’€μ΄ λ˜λŠ” 계산을 주둜 ν•¨μˆ˜ 객체(λžŒλ‹€/λ©”μ„œλ“œ μ°Έμ‘°)둜 ν‘œν˜„ν•˜κ³  반볡 μ½”λ“œμ—λŠ” μ½”λ“œ 블둝을 μ‚¬μš©ν•΄ ν‘œν˜„ν•œλ‹€.
**슀트림으둜 μ²˜λ¦¬ν•˜κΈ° νž˜λ“  경우**
슀트림과 ν•¨μˆ˜ κ°μ²΄λ‘œλŠ” ν•  수 μ—†μ§€λ§Œ, μ½”λ“œ λΈ”λ‘μœΌλ‘œλŠ” ν•  수 μžˆλŠ” 경우λ₯Ό κ΅¬λΆ„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.
1. μ½”λ“œ λΈ”λ‘μ—μ„œλŠ” λ²”μœ„ μ•ˆμ˜ μ§€μ—­λ³€μˆ˜λ₯Ό 읽고 μˆ˜μ •ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ λžŒλ‹€μ—μ„œλŠ” 사싀상 `final` 인 λ³€μˆ˜λ§Œ 읽을 수 있고, μ§€μ—­λ³€μˆ˜ μˆ˜μ •μ€ λΆˆκ°€λŠ₯ν•˜λ‹€.
2. μ½”λ“œ λΈ”λ‘μ—μ„œλŠ” `return` / `break` / `continue` 문으둜 λΈ”λ‘μ˜ 흐름을 μ œμ–΄ν•˜κ±°λ‚˜, λ©”μ„œλ“œ 선언에 λͺ…μ‹œλœ 검사 μ˜ˆμ™Έλ₯Ό 던질 수 μžˆλ‹€. ν•˜μ§€λ§Œ λžŒλ‹€λŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.
**μŠ€νŠΈλ¦Όμ„ μ μš©ν•˜κΈ° 쒋은 경우**
1. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€λ₯Ό μΌκ΄€λ˜κ²Œ λ³€ν™˜ν•΄μ•Ό ν•˜λŠ” 경우 : `map()`
2. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€λ₯Ό 필터링 ν•΄μ•Ό ν•˜λŠ” 경우 : `filter()`
3. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€λ₯Ό ν•˜λ‚˜μ˜ 연산을 μ‚¬μš©ν•΄ κ²°ν•©ν•΄μ•Ό ν•˜λŠ” 경우(λ”ν•˜κΈ°, μ—°κ²°ν•˜κΈ°, μ΅œμ†Ÿκ°’ κ΅¬ν•˜κΈ° λ“±) :
4. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€λ₯Ό μ»¬λ ‰μ…˜μ— λͺ¨μœΌλŠ” 경우(κ³΅ν†΅λœ 속성을 κΈ°μ€€μœΌλ‘œ) : `collect()`
5. μ›μ†Œλ“€μ˜ μ‹œν€€μŠ€μ—μ„œ νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” μ›μ†Œλ₯Ό 찾을 경우 : `filter()`
#### ☁️ 슀트림으둜 μ²˜λ¦¬ν•˜κΈ° μ–΄λ €μš΄ 경우 <a href="#undefined" id="undefined"></a>
ν•œ 데이터가 νŒŒμ΄ν”„λΌμΈμ˜ μ—¬λŸ¬ 단계λ₯Ό ν†΅κ³Όν•΄μ•Όν• λ•Œ, 이 λ°μ΄ν„°μ˜ 각 λ‹¨κ³„μ—μ„œμ˜ 값듀에 λ™μ‹œμ— μ ‘κ·Όν•˜λŠ” κ²½μš°μ—λŠ” μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜κΈ° νž˜λ“€λ‹€. νŒŒμ΄ν”„λΌμΈμ€ 일단 ν•œ 값을 λ‹€λ₯Έ 값에 λ§€ν•‘ν•˜κ³  λ‚˜λ©΄ μ›λž˜μ˜ 값은 μžƒλŠ” ꡬ쑰이기 λ•Œλ¬Έμ΄λ‹€.
> πŸ”– **핡심 정리**\
> 슀트림과 반볡 쀑 μ–΄λŠμͺ½μ΄ λ‚˜μ€μ§€ ν™•μ‹ ν•˜κΈ° μ–΄λ ΅λ‹€λ©΄, λ‘˜ λ‹€ ν…ŒμŠ€νŠΈν•΄λ³΄κ³  더 λ‚˜μ€ μͺ½μ„ νƒν•˜λŠ” 것이 μ’‹λ‹€.
> 좜처 및 참고[https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html](https://www.logicbig.com/tutorials/core-java-tutorial/java-util-stream/short-circuiting.html)\
> [https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Statelessness](https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html#Statelessness)\
> [https://bugoverdose.github.io/development/stream-lazy-evaluation/](https://bugoverdose.github.io/development/stream-lazy-evaluation/)
>
> [https://velog.io/@semi-cloud/Effective-Java-%EC%95%84%EC%9D%B4%ED%85%9C-45-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%80-%EC%A3%BC%EC%9D%98%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC](https://velog.io/@semi-cloud/Effective-Java-%EC%95%84%EC%9D%B4%ED%85%9C-45-%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%80-%EC%A3%BC%EC%9D%98%ED%95%B4%EC%84%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC)
>
> [https://kdg-is.tistory.com/378](https://kdg-is.tistory.com/378)

0 comments on commit 009d430

Please sign in to comment.