[JAVA] Stream이란?

popolarburr·2023년 2월 28일
0
post-thumbnail

[JAVA] Stream이란?

사전적 의미로는 흐르다 또는 개울. 그렇다면 과연 어떤것의 흐름과 개울일까에 대한 답은

→ ‘데이터의 흐름

이 사진에서 보듯이 swimmers.stream()라는 흐름에서 filter를 거쳐 데이터가 필터링되고, 그다음 특정 조건으로 매핑되어 산출되는 하나의 큰 데이터 흐름이다.

한 마디로, stream은 데이터 컬렉션의 반복을 멋지게 하는 기능이다.


❓그렇다면 무엇을 어떻게 사용한다는 건데❓

Stream의 연산과정을 나타낸 사진

스트림은 크게 3 가지 과정으로 나뉜다.


1. 시작은 데이터 컬렉션을 Stream화하여 생성하는 것이다

위 코드로 보면, Integer형으로 받는 list에 아이템을 3개 넣었고, 이를 Stream으로 생성했다.

그렇게 출력해보면

Stream 타입의 변수인 a를 출력해보면 PipeLine이라고 되어있는 것을 확인할 수 있다.

즉, 이는 단순하게 List였던 list를 파이프라인화 , 스트림화하였다는 것을 의미한다.


2. 그 다음으로는 중간 연산이 이루어지는 것이다.


내가 이해한 중간 연산은 이렇다.

내가 원하는 데이터 컬렉션을 원하는 방향으로 만들기 위해 가하는 필수적인 공정.

맨 위에 사진에서 보듯이, filter와 map을 거친다. 이는 무엇을 의미하는가 ? 물고기만 잡기 위해서 갑각류, 어패류를 거르고, 원하는 물고기만 모으는 행위인 것이다.

그렇게 filter -> map / filter -> map / ... /

// 이런 식의 데이터 처리 플로우를 '루프 퓨전'이라고 한다.

이 코드를 보면 전의 코드와 달라진 부분이 많다. list는 그대로 이지만, stream()의 중간 연산이 많이 들어가 있다. 디버깅을 통해 중간 연산을 순서와 그림으로 한 눈에 확인해보자.

  1. list를 stream()하여 스트림화한다.

  1. filter(e → e>10) 를 통해 해당 객체가 10 이상인 값들만 필터링하여 거른다.

  1. sorted((e1,e2) → e1- e2))를 통해 오름차순으로 정렬한다.

  1. map(e → e +” “) 를 통해 숫자에서 문자열로 매핑한다.

여기까지가 중간연산이고 루프퓨전이다.


3. 마지막으로 중간 연산을 거친 데이터 컬렉션을 산출, 추출하는 최종연산이다.

우리는 마지막 코드에서 산출을 list로 하였다.

그렇기에 우리는 Integer에서 String으로 타입으로 바뀐 List 컬렉션의 변수 result에 이 stream의 최종 연산을 담을 수 있다. 아래 사진은 각 아이템들이 String으로 매핑된 것이 List화 되는 마지막 최종연산의 모습이다.


❓그렇다면 왜 사용한다는 건데❓


위의 사진은 자바8 이전의 코드 사진이고, 아래는 자바8 이후의 stream을 사용한 사진이다. 이 사진을 통해 알 수 있는것은 같은 결과값을 도출하는 코드여도 가독성과 유지보수적인 차원에서 비용이 증가했다는 것이다. 또한 개발자의 메서드에 들어가는 모든 데이터들을 내부에서 처리한다는 점에서 필요한 부분만을 사용한다는 것이 용이해졌다.


즉, How 중심의 내부 반복 코드가 What 중심의 외부 반복 코드가 된 것이다.
답을 어떻게 (how) 구할지 메서드에게 구하는 것이 아닌 무엇을 (what)을 구할지의 코드가 된 것이다.


👍🏻 총정리 👍🏻

  1. 데이터 컬렉션의 반복을 도와주고 처리 연산을 지원하도록 소스에서 추출된 값의 연속이다.
  2. 스트림은 데이터의 흐름이고, 자바 Stream API는 데이터를 어떻게 다룰 것인가에 대한 파이프라인이다.
  3. 스트림의 3가지 과정을 통해 모든 데이터 연산을 처리하는 것이 아닌 필요에 의한 연산을 처리하고 공정하는 것이다.





[출처] : 개인공부저장소
[출처] : 유튜브

profile
차곡차곡

0개의 댓글