java8 in aciton Stream 공부
Stream
java8 에 나온 아주 좋은 기능
데이터 처리 연산을 지원하도록 소스에서 추출된 연속된 요소
이건 책에서 나온 개념.
직접 써보니.. for 문 돌며 복잡하고 비효율적으로 짜여진 코드를 stream 으로 여러번이 아닌 한번만 실행하여 원하는 결과를 가져오게끔 해줌.
배열 관련 처리에 아주 효율적으로 처리해준다고 생각
예제
List<Dish> filterList = menuList.stream()
.filter(m -> m.getPrice() >= 14000)
.sorted(Comparator.comparing(Dish :: getPrice))
.collect(Collectors.toList());
- menuList 를 가져와서 stream 에 menulist 를 넣는다.
- 담겨진 stream 내에서 filter 조건대로 분류해줌
- sorted 는 단어 그대로.(정렬 이란 뜻 ㅎ) Dish :: getPrice 는 정렬을 어떤 기준을 하는 지 결정
- 2 번에서 설명했듯 현재 menuList 는 stream 내에 있으니 stream 타입 배열로 되어있는데 우리가 원하는 건 filter 된 stream 타입 배열이 아닌 filter 된 list 타입 배열 즉, collect 를 통해 list 로 캐스팅 해줌.
연속된 요소
스트림은 특정 요소 형식으로 이루어진 연속된 값 집합의 인터페이스를 제공
// 인터페이스 인 걸 확인할 수 있음
public interface Stream<T> extends BaseStream<T, Stream<T>> {
Stream<T> filter(Predicate<? super T> predicate);
.. 생략
// Collection 도 인터페이스
public interface Collection<E> extends Iterable<E> {
int size();
.. 생략
Collection 과 비교해보자면 (Collection 도 집합 인터페이스 제공)
Collection 은 자료구조가 주 컨텐츠라서 시간, 공간, 복잡성 등등 데이터를 담는 것에 중점을 둔다.
반면 Stream 은?
계산이 주 컨텐츠라서 데이터를 필터(filter()), 찾기(find()), 정렬(sorted()) 등등 데이터를 조작하는데 중점을 둠
stream 의 큰 장점
원래는 for 문을 사용해야만 배열은 조작이 가능 list 에 있는 데이터를 for 문을 통해 하나하나 꺼내와서 로직 조건에 맞는 지, 틀린 지 확인해보고 처리
for 문 같은 경우 외부(service 같이 로직짜는 메소드) 에서 우리가 직접 구현했다면
stream 같은 경우 맨 위 예시처럼 조건만 넣어주면 내부에서 알아서 척척 실행해준 뒤 결과물만 딱!
List<Dish> filterList = menuList.stream()
.filter(m -> m.getPrice() >= 14000) // 14000 이상이거나 같은 애만 추리고
.sorted(Comparator.comparing(Dish :: getPrice)) // price 기준으로 정렬하고
.collect(Collectors.toList()); // 리스트로 변환한다