스트림 구현
- Coding/Java
- 2020. 11. 6.
스트림 정의
스트림이란 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소라고 할수있다.
1) 연속된 요소
특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공한다. 요소 저장 및 접근 연산이 주를 이루는 컬렉션과 다르게, 스트림은 filter, sorted, map 처럼 표현 계산식이 주를 이룬다. 컬렉션의 주제는 데이터이고 스트림의 주제는 계산이다.
2) 소스
스트림은 컬렉션, 배열, I/O 자원 등의 데이터 제공 소스로부터 데이터를 소비한다. 정렬된 컬렉션으로 스트림을 생성하면 정렬이 그대로 유지되는 것처럼, 리스트로 스트림을 만들면 스트림의 요소는 리스트의 요소와 같은 순서를 유지한다.
3) 데이터 처리 연산
스트림은 함수형 프로그래밍 언어에서 일반적으로 지원하는 연산과 데이터베이스와 비슷한 연산을 지원한다. filter, map, reduce, find, match, sort 등으로 데이터를 조작할 수 있고, 순차적으로 또는 병렬로 실행할 수 있다.
스트림 특성
1) 파이프라이닝
대부분의 스트림 연산은 스트림 연산끼리 연결해서 커다란 파이프라인을 구성할 수 있도록 스트림 자신을 반환한다.
2) 내부 반복
반복자를 이용해서 명시적으로 반복하는 컬렉션과 달리 스트림은 내부 반복을 지원한다.
스트림 예제코드
List<String> threeHighCaloricDishNames =
menu.stream() // get stream
.filter(dish -> dish.getCalories() > 300) // 데이터 추출
.map(Dish::getName) // getName 메서드 참조하여 요리명 추출
.limit(3) // 개수 3개로 제한
.collect(toList()); // 결과를 다른 리스트 객체에 저장
1) menu에 stream 메서드를 호출해서 스트림을 얻는다.
2) ‘collect’를 제외한 모든 연산은 서로 파이프라인을 형성할 수 있도록 스트림을 반환한다.
3) 마지막으로 collect 연산으로 파이프라인을 처리해서 결과를 반환한다.
파이프라인의 filter, map, limit, collect이 어떤 작업을 수행할까?
1) filter
람다를 인수로 받아 스트림에서 특정 요소를 제외시킨다.
.filter(dish -> dish.getCalories() > 300) : 람다를 전달해서 조건에 맞는 데이터를 선택한다.
2) map
람다를 이용해서 한 요소를 다른 요소로 변환하거나 정보를 추출한다.
.map(Dish::getName) : 메서드 참조 Dish::getName을 전달해서 원하는 데이터를 추출한다.
3) limit
정해진 개수 이상의 요소가 스트림에 저장되지 못하게 스트림 크기를 축소 truncate 한다.
4) collect
스트림을 다른 형식으로 변환한다.
.collect(toList()); : 스트림을 리스트로 변환한다.
결과적으로 스트림 API는 파이프라인을 더 최적화할 수 있는 유연성을 제공한다.
'Coding > Java' 카테고리의 다른 글
스트림 연산 (0) | 2020.11.06 |
---|---|
스트림 vs 컬렉션 (0) | 2020.11.06 |
스트림의 기본개념 (0) | 2020.11.06 |
람다의 메서드 참조 (0) | 2020.11.06 |
람다의 형식 검사, 형식 추론, 제약 (0) | 2020.11.06 |