모던 자바 인 액션 (세션 4)

kimseungki·2022년 6월 18일
0

독서

목록 보기
5/8
post-thumbnail

개요

스트림이 왜 나왔고, 컬랙션과 비교해서 어떤 차이가 있는지를 설명했다.

스트림이 나오게 된 배경

이전엔 컬렉션을 썼다. 하지만 컬렉션의 경우 멀티코어 아케텍쳐를 활용한 병렬처리하기 위해
코드를 만드는 것은 복잡하고 어렵다. 이를 위한 해결방법이 스트림이다.

컬렉션 단점

ArrayList<Person> list = new ArrayList<>();
ArrayList<Person> mid = new ArrayList<>();
ArrayList<String> name = new ArrayList<>();
for(Person p : list) {
	if(p.age > 30 && p.location.equals("Suwon")) {
    	mid.add(p);
    }
}
for(Person p : mid) {
	name.add(p.name);
}

이런 식으로 객체의 조건을 비교할 때도 for-each 호출, 원하는 데이터만 담기위해
for-each 호출을 하는 등, 조건 비교 및 데이터 삽입을 위해 2번을 호출해야되는 불편함이 존재한다.

스트림

ArrayList<Person> list = new ArrayList<>();
ArrayList<String> name = list.stream()
								.filter(p -> p.age>30 && p.location.equals("Suwon")
                                .collect(Collections.toList());

for-each, if를 전혀 쓸 필요 없이 선언형(filter, collect 등)으로 코드를 구현할 수 있다.

스트림과 컬렉션 차이

컬랙션 : 시간, 공간의 복잡성과 관련 된 요소 저장 및 접근 연산이 주인 편(list.add, if(조건문))
스트림 : filter, sorted 등과 같은 표현 계산식이 주를 이루는편
반복 : 컬렉션은 for-each와 같은 외부영역에서 반복처리, 스트림은 내부에서 반복처리

  • 데이터 처리 연산 : DB와 유사한 연산을 지원
  • 소스 : 배열에 있는 정보와 같은 순서로 저장
    컬렉션의 주체는 데이터, 스트림은 계산이 목적

스트림 특징

파이프라이닝 : 스트림은 중간연산에 있는 정보를 연결해서 파이프라인을 구성해 추후 Stream으로 반환한다. 여기서 '게으름'이라는 용어가 나오게 된다.
내부반복 : 스트림은 내부에서 반복 지원

스트림 연산 소개

filter : 특정 요소 제외(Predicate 활용)
map : 해당 입력을 특정타입으로 묶어서 map 처리(Function 활용)
limit : 정해진 개수 이상을 못받도록 제한
collect : 스트림을 다른 형식(list, Integer 등)으로 변환

스트림 연산 종류

  1. 스트림은 중간연산, 최종연산을 구분된다.
  2. 중간연산 : filter, map, limit
  3. 최종연산 : collect
  • 중간연산과 최종연산의 차이는 반환값이 Stream타입을 그대로 유지하거나(중간연산),
    Stream타입을 다른 타입으로 변환하는 차이이다.

신기한 점

스트림에 있는 계산메소드(filter 등)은 람다 및 메소드 참조가 가능하다.
따라서 데이터처리 연산 역시 간결하고 유연하게 처리할 수 있다는 점이 인상적이었다.

스트림 연산 프로세스

  1. 스트림은 초기에 스트림에 들어갈 데이터를 가져온다.
  2. filter, map과 같은 중간연산을 만난다면, 파이프라인을 구성할 중간 연산을 연결한다.
  3. 이후 최종연산을 만난다면, 구축 된 스트림 파이프라인을 실행시켜 계산을 한다
  4. 해당 데이터를 최종연산에 삽입한다.
  • 따라서 리스트 조회는 한번만 실행이 된다.
  • 중간연산은 최종연산이 될 때까지 계산을 하지 않기 때문에 Lazy로 표현할 수 있다.
  • 만약 filter, map 이런곳에 System.out.println을 하게 된다면, 최종연산에 대한 데이터가 출력이 된다.

후기

이번 챕터는 스트림을 왜 쓰는가에 대해 의문을 해결하게 된 계기가 되었다.
다음 챕터는 좀 더 깊은 스트림에 대한 이해를 요구하지 않을까 싶다.

profile
seung 기술블로그

0개의 댓글