JaeniWorld
[Java] Stream API, Stream과 Collection의 차이 본문
반응형
Stream Process
한 번에 한 개씩 만들어지는 연속적인 데이터 항목들의 모임으로 예로 들자면 공장 라인을 들 수 있다 한 작업장에서 작업물을 받아 다음 작업을 처리할 수 있도록 넘겨주는 것이다. 이때 각각의 작업장은 다른 업무를 처리하지만 전체적으로 보았을 때, 동시간에 작업을 처리하고 한 개의 작업물 만을 작업한다.
** 데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
Stream예시) 입력 스트림은 데이터를 한 개씩 읽음 / 출력 스트림은 데이터를 한 개씩 기록
Stream API
스트림은 자바 8 API에 새로 추가된 기능으로 이를 이용하면 선언형으로 컬렉션 데이터를 처리할 수 있다. 기존 자바7에서 저칼로리의 요리명을 반환하고, 칼로리를 기준으로 요리를 정렬하는 코드이다. 이 상황에서 400 칼로리 이하의 음식을 담는 lowCaloricDishes는 가비지 변수 (컨테이너 역할만 하는 변수)가 된다.
List<Dish> lowCaloricDishes = new ArrayList<>();
for(Dish d: ,menu){
if(dish.getCalories() < 400){
lowCaloricDishes.add(dish);
}
}
}
Collections.sort(lowCaloricDishes, new Comparator<Dish>()}
public int compare(Dish d1, Dish d2){
return Integer.compare(d1.getCalories(), d2.getCalories());
}
});
List<String> lowCaloricDishesName = new ArrayList<>();
for(Dish dish: lowCloricDishes){
lowCaloricDishesName.add(dish.getName());
}
스트림을 사용하면 선언형으로 코드를 구현할 수 있기 때문에 위와 달리 짧고 간결한 코드를 볼 수있게 된다.
import static java.util.Comparator.comparing;
import static java.util.stream.Collectors.toList;
List<String> lowCaloricDishesName=
menu.stream()
.filter(d->d.getCalories()<400)
.sorted(comparing(Dish::getCalories))
.map(Dish::getName)
.collect(toList());
해당 코드에서 stream()을 parallelStream()을 사용하면 아키텍처에서 해당코드를 병렬로 사용할 수 있다.
Stream과 Collection
Stream | Collection | |
표현계산식 (ex. Filter, sorted, map, etc.) |
주 구성요소 | 시간과 공간의 복잡성과 관련된 요소 저장 및 접근 연산 |
요청할 때만 | 데이터 계산 시점 | 모든 값이 계산을 기다릴 때 까지 |
내부반복 | 반복 | 외부반복 |
Reference
-docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
반응형
'프로그래밍 > JAVA' 카테고리의 다른 글
[Java] 디폴트 메소드(Default methods) (0) | 2021.01.12 |
---|---|
[Java] Java 8에 추가된 API (0) | 2021.01.12 |
[Java] Collection factory (0) | 2021.01.12 |
[Java] Stream 데이터 수집 (0) | 2021.01.11 |
[Java] Stream 연산 (0) | 2021.01.11 |
Comments