본문 바로가기
JAVA

스트림

by 공부 안하고 싶은 사람 2021. 2. 19.
반응형

filter, sorted, map, collect 와 같은 여러 빌딩 블록 연산을 연결해서 복잡한 데이터 처리 파이프라인을 만들 수 있습니다. 여러 연산을 파이프라인으로 연결해도 여전히 가독성과 명확성이 유지가 됩니다. filter 메서드의 결과는 sorted 메서드의 input으로, 다시 sorted의 결과는 map메서드의 input으로, map 메서드의 결과는 collect로 연결됩니다

고수준 빌딩 블록(high-level building block)으로 이루어져 있으므로 특정 스레딩 모델에 제한되지 않고 자유롭게 어떤 상황에서든 사용

List<String> lowCaloriesDishNames = menu.stream()
    .filter(d-> d.getCalories()<400)
    .sorted(Comparator.comparing(Dish :: getCalories))
    .map(Dish::getName)
    .limit(3)
    .collect(Collectors.toList());
//List<Dish> 각요소의 스트림을 얻기
//400칼로리 이하의 음식중
//칼로리낮은순으로 정렬
//3개만 이름을 담아 리스트 반환

중간 연산의 연속으로 내부반복
Laziness - 최종 연산까지는 아무 연산도 실행 X
Circuiting - 빠른탈출(조건 충족/불충족시 종료)

  • filter : Predicate(boolean을 반환하는 함수)를 인수로 받아서 Predicate와 일치하는 모든 요소를 포함하는 Stream을 반환합니다.
    이후 distinct() 로 중복제거 가능
    takeWhile으로 false 나올 때 까지 Predicate적용 (정렬 됐다면, 빠른 탈출을 가능하게 함) <-> dropWhile
  • limit : 선착순
    skip : 건너뛰기
  • map : 인자로 제공된 함수는 각 요소에 적용되어, 적용된 결과가 새로운 요소로 매핑됨
    distinct으로 중복 제거(like HashSet)
    flatMap(Arrays::stream)을 통해 각 요소의 stream을 하나로 합쳐서 연산할 수 있다
    -> Optional<Optional<>>을 Optional<>으로 평준화 작업
  • collect : Collectors.toList() 를 이용하여 매핑된 결과들의 콜렉션으로 변환가능
  • boolean을 리턴하는 다른 최종연산(Circuiting)
    anyMatch : 요소가 존재하는지 검사
    allMatch : 모든 요소 일치하는지 검사 <-> nonMatch
    findFirst : 첫번째 반환
    findAny : 랜덤반환
  • reduce("초기값", 람다)
  • List<Integer> numbers = Arrays.asList(1, 2, 3, 4); int product = numbers.stream().reduce(1, (a, b) -> a * b); // 1 * 1 * 2 * 3 * 4 실행 Optional<Integer> max = numbers.stream().reduce(Integer::max); //최대값

 

 

스트림 단점

  • 단순 [for-loop]의 경우 오버헤드가 없는 단순한 인덱스 기반 메모리 접근이기 때문에 [Stream]을 사용했을 때보다 더 빠르다고 합니다.
  • 또, 컴파일러의 관점에서 오랫동안 유지해온 for-loop의 경우 최적화를 할 수 있으나 반대로 비교적 최근에 도입된 스트림의 경우 for-loop와 같은 정교한 최적화를 수행하지 않습니다.
  • 스트림을 이용하면서 람다(lambda) 또는 메서드 참조(method references)를 사용하는 경우에는 지역 변수(local variables)에 접근할 수 없다.
728x90
반응형

'JAVA' 카테고리의 다른 글

SOLID  (0) 2021.06.28
디자인 패턴  (0) 2021.06.28
인코딩 변환  (0) 2021.04.29
함수형 인터페이스  (0) 2021.02.19
Jackson Library (ObjectMapper)  (0) 2021.02.09

댓글