본문 바로가기
정리/Java

Java - 스트림(Stream)

by 난파선 2017. 3. 2.


스트림이란 '데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소'

스트림은 컬렉션 보다 개념적으로 높은 수준의 데이터 뷰 역할을 하며, 이를 이용하면 좀 더 직관적으로 계산을 명시할 수 있다.
선언형으로 코드를 구현할 수 있다. 즉 루프와 if 조건문 등의 제어 블록을 사용해서 어떻게 구현할 지 지정할 필요 없이 '저칼로리의 요리만 선택하라' 같은 동작의 수행을 지정할 수 있다.

루프에서는 연산 순서를 자세히 작성해야 하지만, 스트림은 결과만 맞으면 원하는 방식으로 연산을 스케줄링 할 수 있다.
메서드 이름을 보면 코드가 무엇을 의도하는 지 바로 알 수 있다.

스트림을 이용하면 멀티스레드 코드를 구현하지 않아도 데이터를 병렬로 처리할 수 있다.
데이터의 소스와 프로퍼티를 지정하면 스트림 라이브러리에서 계산을 최적화 할 수 있다.

여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있다. 여러 연산을 파이프라인으로 연결해도 가독성과 명확성이 유지된다.
List<Food> lowCalorie = new ArrayList<>();

for (Food d : menu) {
    if (d.getCalories() < 400)    //칼로리가 400이하인 음식
        lowCalorie.add(d);
}

Collections.sort(lowCalorie, new Comparator<Food>() {        //정렬
    public int compare(Food d1, Food d2) {
        return Integer.compare(d1.getCalories(), d2.getCalories());
    }
});

List<String> foodName = new ArrayList<>();     
for (Food d : lowCalorie) {
    foodName.add(d.getName());  //음식이름 따로 저장
}


//Stream 사용
List<String> lowCalorieFoodName = menu.stream()
    .filter(d -> d.getCalories() < 400)    // 400이하의 칼로리
    .sorted(comparing(Food::getCalories))    // 정렬
    .map(Food::getName)    // 음식이름 추출
    .collect(Collectors.toList());

댓글