코딩 기록들
[Java Stream Programming] 4. Filtering & Slicing 본문
필터링
- filter()
List<Dish> vegitarianMenu =
menu.stream()
// 채식 요리인지 확인하는 메서드 레퍼런스
.filter(Dish::isVegerarian)
.collect(Collectors.toList());

필터링 예제
List<Dish> menu = DishData.menu;
menu.stream() //Stream<Dish>
//이 filter를 제일 많이 씀
//Stream<Dish> = {french fries, rice, season fruit};
.filter((Dish dish) -> dish.isVegetarian()) //boolean의 결과가 true라면 스트림으로 만들어줌
//반복하며 출력
//forEach : Consumer<Dish> : filter가 만들어준 새로운 Stream<Dish>를 반복하겠다
.forEach((Dish dish) -> {
System.out.println("Stream 이름: " + dish); //메뉴명
System.out.println("Stream 채식여부: " + dish.isVegetarian()); // false = 채식아님
});
고유요소 필터링
- distinct() : 중복되는 데이터 전부 제거
List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
numbers.stream()
.filter(i -> i % 2 == 0) //2,2,4
.distinct() //중복되는 데이터 전부 다 제거 -> 2,4, Stream 만든다
.forEach(System.out::println);

distinct 예제
List<Integer> numbers = Arrays.asList(1,2,1,3,3,2,4);
//짝수만 추려와서 중복을 제거하고 나머지를 출력
numbers.stream() //Stream<Integer>로 만들어짐
.filter((Integer n) -> n % 2 == 0) //결과 : Steram<Integer> = {2,2,4}
//Stream<Integer> = {2,4}
.distinct() //알아서 중복값 제거
.forEach((Integer n) -> System.out.println(n));
;
스트림 축소 : limit(숫자)
List<Dish> dishes =
menu.stream()
.filter(d -> d.getCalories() > 300)
.limit(3)
.collect(Collectors.toList());
요소 건너띄기 : skip(숫자)
List<Dish> dishes =
menu.stream()
.filter(d -> d.getCalories() > 300)
.skip(2)
.collect(Collectors.toList());
* Slicing 할때는 skip, limit의 순서에 유의해야함
스트림축소 예제
// 스트림 축소 : 메뉴 중 칼로리가 300보다 큰 것 중 아무거나(정렬안된 데이터의 앞)
// 3개 가져와서 조회
// 1st for문으로 만들어보기 : 1. 3개만 담을 새로운 array list 만들어줌
List<Dish> dishes = new ArrayList<>();
for (Dish dish : menu) {
if (dish.getCalories() > 300) {
dishes.add(dish);
}
if (dishes.size() == 3) {
break;
}
}System.out.println(dishes);
// 2nd. 스트림으로 만들어보기 : 스트림 내부에서 앞에있는 아무거나 3개 가져와라
menu.stream()
.filter((Dish dish) -> dish.getCalories() > 300)
.limit(3)
.forEach((Dish dish) -> {
System.out.println("칼로리가 300보다 큰 랜덤한 3가지 음식: " + dish); // false = 채식아님
});