컬렉션으로 데이터를 그룹화 하고 처리한다. 예를 들어 요리 컬렉션에서 각 요리의 칼로리를 계산하여 특정 칼로리 이하의 음식만 조회한다고 생각해보자. 데이터베이스에서는 SELECT name FROM 요리 WHERE 칼로리 < 500
이런식으로 쿼리를 만들 수 있다. 반복문의 사용 없이 속성만 이용하여 계산한다. 자바의 반복문과 다르게 구체적인 구현을 할 필요가 없다. 정말 많은 데이터라면 성능을 높이기 위해 병렬처리하여 구현하지만 이런 구현은 매우 복잡하고 어렵다. 이런 문제를 해결하기 위해 스트림을 만들었다.
자바 8부터 추가된 기능이다. 스트림을 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 또한 멀티스레드 코드를 구현하지 않아도 데이터를 투명하게 병렬처리할 수 있다. 간단히 코드를 보며 비교해보자.
List<Dish> lowCaloricDishes = new ArrayList<>();
for (Dish dish : menu) {
if (dish.calories < 500) {
lowCaloricDishes.add(dish);
}
}
위와 같은 코드를 다음과 같이 스트림을 사용하여 세부 구현은 라이브러리 안에서 처리한다.
List<Dish> lowCaloricDishes = menu.stream()
.filter(dish -> dish.calories < 500)
.collect(Collectors.toList());
stream() → parallelStram() 으로 변경하면 멀티쓰레드에서 병렬로 실행할 수 있다. 병렬 처리에 관한 내용은 나중에 자세히 다룬다.
스트림이 주는 다양한 이득
스트림 : 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
연속된 요소