티스토리 뷰

스트림 슬라이싱

  • 스트림의 요소를 선택하거나 스킵하는 다양한 방법을 설명한다.
    • 스트림의 처음 몇개의 요소를 무시하는 방법, 특정 크기로 스트림을 줄이는 방법 등등

프레디케이트를 이용한 슬라이싱

  • 자바9에서는 스트림의 요소를 효과적으로 선택할 수 있도록 takeWhile, dropWhile 두 가지 메서드를 지원한다.

TAKEWHILE

List<Dish> specialMenu = Arrays.asList(
    new Dish("seasonal fruit". true, 120, Dish.Type.OTHER),
    new Dish("prawans". true, 300, Dish.Type.FISH),
    new Dish("rice". true, 350, Dish.Type.OTHER),
    new Dish("chicken". true, 400, Dish.Type.MEAT),
    new Dish("french fries". true, 530, Dish.Type.OTHER));
  • 만일 위와 같은 리스트에서 320 칼로리 이하의 요리만 가지고 오고 싶다고 해보자.
  • 스트림을 사용한다고 하면 filter 메서드를 이용하면 될 것이다.
List<Dish> filteredMenu = specialMenu.stream()
    .filter(dish -> dish.getCalories() < 320)
    .collect(toList());
  • 현재는 filter 연산이 리스트 전부에게 적용이 된다.
  • 여기서 좀 더 나아가서 생각을 해보자면 위 specialMenu는 정렬된 리스트이기 때문에 320칼로리 보다 큰 요리가 나오면 반복을 중단시킬 수 있다.
    • 만약 리스트가 훨씬 크다면 최적화의 여지가 있을 수 있음
  • 이때 takeWhile 연산을 이용하게 되면 간단하게 목적을 이룰 수 있다.
    • 이때 takeWhile은 Predicate를 받음
List<Dish> filteredMenu = specialMenu.stream()
    .takeWhile(dish -> dish.getCalories() < 320)
    .collect(toList());

DROPWHILE

  • takeWhile 연산의 정반대 작업을 수행한다.
  • Predicate가 처음으로 거짓이 되는 지점까지 발견된 요소를 버린다.
  • Predicate가 거짓이 되는 시점에 작업을 중단하고 이후 남은 요소를 반환한다.
List<Dish> filteredMenu = specialMenu.stream()
    .dropWhile(dish -> dish.getCalories() < 320)
    .collect(toList());

트림 축소

  • 스트림은 주어진 값 이하의 크기를 값는 새로운 스트림을 반환하는 limit(n) 메서드를 지원한다.
List<Dish> filteredMenu = specialMenu.stream()
    .filter(dish -> dish.getCalories() > 300)
    .limit(3)
    .collect(toList());

요소 건너뛰기

  • 스트림은 처음 n개 요소를 제외한 스트림을 반환하는 skip(n) 메서드를 지원한다.
  • 아래는 300 칼로리 이상의 처음 두 요리를 건너뛴 다음에 해당되는 요리를 반환한다.
List<Dish> filteredMenu = specialMenu.stream()
    .filter(dish -> dish.getCalories() > 300)
    .skip(2)
    .collect(toList());

 


참고

 

모던 자바 인 액션

자바 1.0이 나온 이후 18년을 통틀어 가장 큰 변화가 자바 8 이후 이어지고 있다. 자바 8 이후 모던 자바를 이용하면 기존의 자바 코드 모두 그대로 쓸 수 있으며, 새로운 기능과 문법, 디자인 패턴�

www.yes24.com

반응형
댓글