[Java] Lambda - Stream
- Java
- 2020. 8. 17.
이번 글에서는 stream에 대해 간단하게 알아보도록 하겠습니다.
1. Stream
stream이란 java8부터 추가된 기능으로, collections에 lambda를 사용해 효율적으로 iteration을 수행할 수 있는 기능입니다.
이전 글에서 살펴보았던 forEach도 stream의 한 종류로 생각할 수 있으며, 사전적 정의는 다음과 같습니다.
"A sequence of elements supporting sequential & parallel aggregate operations"
음.. 조금더 자세히 살펴보겠습니다. 😅
예를 들어 위와 같이 총 6개의 car로 구성된 Cars collections이 있으며, Cars collections이 정비를 위해 정비소에 들렸다고 가정해보겠습니다.
이때 기존의 iteration 방법은, 모든 Cars의 elements를 점검 및 수리하기위해 sequential하게 모든 car를 점검 및 수리했습니다.
// engine
for(int i=0; i<Cars.size(); i++){
checkEngine(Cars.get(i));
}
// tire
for(int i=0; i<Cars.size(); i++){
checkTire(Cars.get(i));
}
// window
for(int i=0; i<Cars.size(); i++){
checkWindow(Cars.get(i));
}
Engine & Tire & Window 수리공들이 각자의 job을 수행하기위해 sequential하게 모든 collections을 iteration했으므로, 총 3번의 iteration이 발생했었습니다.
stream은 위와 같은 방법을 개선해.. 다음과 같이 작업을 수행합니다.
Cars Collections은 이제 conveyor belt(sequence of elements)에 올라와 있는 것처럼 Engine & Tire & Window 작업 line을 지나게되고, 이때 각 작업자들은 본인들의 맡은바 역할을 본인들의 자리에서 수행합니다.
마치.. 자동차 공장처럼 동작한다고 이해하면 될 것 같습니다. 😅
stream을 사용한 예제는 다음과 같습니다.
// list
List<Person> people = Arrays.asList(
new Person("Charles", "Dickens", 60),
new Person("Lewis", "Carroll", 42),
new Person("Thomas", "Carlyle", 51),
new Person("Charlotte", "Bronte", 45),
new Person("Matthew", "Arnold", 39)
);
// stream
people.stream()
.filter(p-> p.getLastName().startsWith("C"))
.forEach(p->System.out.println(p.getFirstName()));
해석해보면 먼저 people collections을 stream 선언해 convery belt에 올립니다.
다음으로, filter 작업자는 전달받은 predictive lambda 를 만족하지 않는 elements를 convery에서 제거합니다.
제거되지 않은 elements는 다음 foreEach 작업자 앞으로 이동하고, foreEach 작업자는 consumer lambda를 수행합니다.
"filter"는 input parameter로 "Predictive Functioanl Interface"를 "forEach"는 "Consumer Functional Interface"를 전달받습니다.
실행한 결과는 다음과 같습니다.
위와 같이 stream을 사용하면 효율적이고 간결하게 collections에 iteration을 적용할 수 있습니다. 👏👏👏
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Java' 카테고리의 다른 글
[Java] Lambda - Foreach Iteration (0) | 2020.08.17 |
---|---|
[Java] Lambda - Method Reference (0) | 2020.08.16 |
[Java] Lambda - This Reference (0) | 2020.08.16 |
[Java] Lambda - Closure (0) | 2020.08.16 |
[Java] Lambda - Exception Handling (0) | 2020.08.16 |