티스토리 뷰

프로그래밍/JAVA

[Java] 스트림 슬라이싱

rlawlstjd007 2020. 8. 4. 09:51

들어가며

  • 본 글은 책 '모던 자바 인액션'을 토대로 정리한 내용이며 지극히 본인의 생각으로 몰랐던, 학습이 필요한 부분을 골라서 작성한 글입니다.
 

모던 자바 인 액션

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

www.yes24.com


스트림 슬라이싱

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

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

  • 자바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());
반응형
댓글