Skip to content

Commit fb5223d

Browse files
committed
docs:스트림 정리
1 parent 1e9b6dd commit fb5223d

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

10week/스트림 정리.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
---
2+
3+
# Stream의 특징 정리 (map, filter, sorted, distinct, limit. foreach)
4+
5+
---
6+
7+
## 자바 8 스트림?
8+
9+
💁 자바 8에서 추가된 스트림은 람다식을 활용한 기술 중 하나로 테이터의 흐름이라는 뜻을 가지고 있다.
10+
11+
💁 스트림이란 간단하게 설명하면 자바의 컬렉션의 반복을 기존의 반복문 보다 효율적으로 처리하는 방식이라고 생각하면 이해가 쉽다. 스트림 이용시 따로 멀티 스레드 코드를 구현하지 않아도 병렬로 데이터가 처리가 된다.
12+
13+
💁 스트림은 선언형 코드로 구현이 가능하다. 루프, if 등의 조건문을 이용해 어떻게 동작할지 지정하지 않아도 선언형 방식으로 동작을 지정할수 있어 변하는 요구사항에 효율적으로 대응이 가능하다. 따라서 람다식을 통해 기존 코드의 중복을 줄이고 특정 조건을 필터링 하는 코드를 쉽게 구현이 가능하다.
14+
15+
💁 위와 같은 특징으로 인해 Sort, Filter, Map 등의 빌딩 블록 연산을 이용해 복잡한 데이터 처리에 유용하며 가독성을 해치지 않는다.
16+
17+
- 요약
18+
19+
---
20+
21+
## 스트림과 컬렉션
22+
23+
💁 자바의 기존 컬렉션과 스트림 모두 순차적으로 데이터를 저장하는 형식의 자료구조 인터페이스를 제공한다. 하지만 이 둘의 가장 큰 차이점은 언제 계산하느냐 이다.
24+
25+
🤔 컬렉션 : 자료구조가 포함하는 모든 값을 메모리에 저장 = 즉 컬렉션에 추가 되기전에 계산이 되어야 한다.
26+
27+
🤔 스트림 : 이론적으로 요청 할때만 요소를 계산하는 고정된 자료구조( 스트림에 자료를 추가하거나, 삭제 불가능 ) 스트림은 요청하는 값만 스트림에서 추출을 하는데 이는 사용자는 알 수 없다. 결과적으로 생산자와 소비자관계를 형성하게 된다.
28+
29+
🖍 **하나의 스트림은** **스트림은 한번만 사용 가능하다.**
30+
31+
- 반복자와 동일하게 스트림도 한번만 탐색 할수 있으며 다시 사용 하고 싶다면 새로운 스트림을 만들어야 한다. 또 스트림은 시간적으로 흩어진 값의 집합으로 간주 할수 있다.
32+
33+
---
34+
35+
## 스트림 연산
36+
37+
🖍 **중간 연산**
38+
39+
- filter  나 sorted 같은 중간 연산은 연산 후에 다른 스트림을 반환한다. 이 특성을 이용해 연속해서 질의를 이어 나갈수 있다. 중간 연산은 중요한 특징은 Lazy한 특성을 갖고 있어 단말 연산을 스트림 파이프 라인에 실행하기 전까지는 어떤 연산도 수행도 하지 않는다. 그저 합쳐 놓고 최종 연산으로 한번에 처리 한다.
40+
41+
🖍 **최종 연산**
42+
43+
- 최종 연산은 파이프 라인에서 결과를 도출하고 스트림 이외의 결과가 반환 된다.
44+
45+
☝️ **생성하기**
46+
47+
- 보통 배열을 이용해 스트림을 만들지만 이외의 방식으로도 스트림을 생성이 가능하다.
48+
49+
**배열 스트림**
50+
51+
- 배열은 [Array.stream](http://array.stream) 메소드를 이용해 생성을 한다.
52+
53+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c1ff0f64-78d9-4232-becf-1601432db851/_2021-04-28__11.31.17.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c1ff0f64-78d9-4232-becf-1601432db851/_2021-04-28__11.31.17.png)
54+
55+
**컬렉션 스트림**
56+
57+
- 컬렉션 타입을 이용해서도 스트림을 생성 가능하다.
58+
59+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c030af2b-17b3-4162-a03b-1595e93f3068/_2021-04-28__11.28.35.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c030af2b-17b3-4162-a03b-1595e93f3068/_2021-04-28__11.28.35.png)
60+
61+
☝️**Filtering**
62+
63+
- 필터는 스트림 내 요소들을 하나씩 평가해 걸러내는 작업으로 boolean을 리턴하게 된다.
64+
65+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/58492cb9-7b22-4ef6-9486-832ead9f52db/_2021-04-28__11.38.45.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/58492cb9-7b22-4ef6-9486-832ead9f52db/_2021-04-28__11.38.45.png)
66+
67+
- 위 코드는 요소중에 동현이라는 값을 가진 요소를 제외 하고 나머지는 필터링 하는 코드이다.
68+
- collect을 이용해 필터링을 하고 결과를 리스트로 반환 해준다.
69+
70+
☝️ **Mapping**
71+
72+
- 특정 객체에서 특정 데이터를 선택하는 작업은 데이터 처리과정에서 자주 수행 되는 연산이다. 스트림 에서는 map 과 flatMap을 제공한다.
73+
- Map : 스트림의 각 요소에 함수 적용
74+
- 각 요소에 적용 돼 새로운 요소로 매핑이 된다.
75+
76+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7368d742-5990-4a72-ae87-088dfe3defec/_2021-04-28__12.03.14.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7368d742-5990-4a72-ae87-088dfe3defec/_2021-04-28__12.03.14.png)
77+
78+
- 위 코드는 carNames 라는 string 배열의 값을 이용해 Car객체로 생성해주는 매핑이다.
79+
- flatMap : 중간 중첩 구조를 한단계 제거 하고 단일 컬렉션으로 만들어 주는 역할을 한다.
80+
81+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d87f0f85-808c-456e-99f4-22fd5b967b82/_2021-04-28__12.23.02.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d87f0f85-808c-456e-99f4-22fd5b967b82/_2021-04-28__12.23.02.png)
82+
83+
☝️ **Sorting**
84+
85+
- 스트림에서 sort는 스트림 아이템을 정렬후 새로운 스트림을 생성한다. 다른 정렬과 마찬가지로 comparator 를 이용하며 인자 없이 그냥 호출시 오름차순으로 정렬 된다.
86+
87+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0b068347-4fb2-4b89-9905-aa61607f281e/_2021-04-28__12.35.35.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0b068347-4fb2-4b89-9905-aa61607f281e/_2021-04-28__12.35.35.png)
88+
89+
- 인자를 넘기는 경우에는 comparator 를 이용하게 된다. String 의 경우에는 Comparable 인터페이스가 구현이 되어있어 Comparator 를 바로 사용할수있지만 그렇지 않은경우에는 직접 정의를 해야한다.
90+
91+
☝️ **Distinct**
92+
93+
- 사전적의미로는 뚜렷한, 분명한 이란 의미를 가지고 있는데 이는 스트림에서 중복제거를 도와주는 역할을 한다. 즉 스트림에서 사용시 중복된 요소를 모두 제거 하고 새로운 스트림을 생성해준다. 중복된 요소의 판단 기준은 Object.equals(Object) 값이다.
94+
95+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e78bd6eb-b284-4954-935b-241db29c77ec/_2021-04-28__12.42.46.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/e78bd6eb-b284-4954-935b-241db29c77ec/_2021-04-28__12.42.46.png)
96+
97+
☝️**Limit**
98+
99+
- Limit는 어떤 스트림에서 일정 개수 만큼 가져와 새로운 스트림을 생성하는데 사용 방법은 Stream.limit(숫자) 로 숫자만큼 데이터를 셀렉하고 스트림으로 생성하게 된다.
100+
101+
![https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c2a2929a-96b3-435e-8a17-abf793293b49/_2021-04-28__12.46.02.png](https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c2a2929a-96b3-435e-8a17-abf793293b49/_2021-04-28__12.46.02.png)
102+
103+
🔍 forEach에 대해서는 다음 정리에서 다루도록 하겠습니다.
104+
105+
---
106+
107+
## Reference
108+
109+
[https://futurecreator.github.io/2018/08/26/java-8-streams/](https://futurecreator.github.io/2018/08/26/java-8-streams/)
110+
111+
[https://12bme.tistory.com/461](https://12bme.tistory.com/461)
112+
113+
[https://codechacha.com/ko/java8-stream-limit-skip/](https://codechacha.com/ko/java8-stream-limit-skip/)

0 commit comments

Comments
 (0)