필터링과 슬라이싱

GW·2023년 7월 31일




public class BasicStream2 {
	public static void main(String[] args) {
		List<DishVO> dishes = new ArrayList<DishVO>();
		dishes.add(new DishVO("Pork", 1000, "MEET"));
		dishes.add(new DishVO("Salmon", 500, "FISH"));
		dishes.add(new DishVO("Beef", 1200, "MEET"));
		dishes.add(new DishVO("Chicken",900, "MEET"));
		dishes.add(new DishVO("Pizza", 1500, "OTHER"));
		dishes.add(new DishVO("Rice", 300, "OTHER"));
		dishes.add(new DishVO("French Fries", 700, "OTHER"));
		//함수형 언어의 특징.
		//1.모든것은 함수로 이루어져있다.(완전한 함수형 언어일 떄에만)
		//2.함수는 모든 것을 할 수 있다.
		//2-1. 함수의 원형을 변수에 할당 할 수 있다.
			//2-1-1함수를 람다로 전달할 수 있다.
			//2-2-2 클래스를 함수로 전달할 수 있다.(메소드 참조: 메소드 레퍼런스)
		//2-2. 함수는 파라미터로 전달될 수 있다.  //자바는 여기에중점을 둔다.
		//2-3 함수는 함수를 반환할 수도 있다.
		//2-4 함수내에 다른 함수를 정의할 수 있다.
//채식 요리만 출력
		//1.람다
		dishes.stream()
			  .filter((dish)-> dish.isVegeterian())
			  .forEach((dish)->{
				  System.out.println(dish.getName());
			  });
	//2. 메소드 레퍼런스(출력도 메소드 레퍼런스를 이용 )
		dishes.stream()
			  .filter(DishVO::isVegeterian)//람다 헤더, 람다 바디, 화살표 모두 생략
			//.map((dish)->dish.getName())
			  .map(DishVO::getName)
			  .forEach(System.out::println);
//3.요리의 종류가 MEET 인것만 골라/서 요리명만 List에 할당하기 
		//			 filter           map
		List<String> meetDishName= dishes.stream()
										 .filter((dish)->dish.getCategory().equals("MEET")) // 필터링을 통해 MEET만 구해야하는데 이미 정의한게 없어서 풀어야한다.
										 .map(DishVO::getName) //이름만 반환해줘야하는데 DishVo에 저장되어 있어서 그래로 활용하여 메소드 레퍼런스 사용
										 .collect(Collectors.toList());
		System.out.println(meetDishName);
//배열을 리스트로 변경해서 짝수만 골라내 중복요소 제거후 리스트로 변환한다.
		Integer[] numberArray= {1,2,1,3,3,2,4};
		// 배열을 리스트로 변경.
		List<Integer> numberList = Arrays.asList(numberArray);
//		List<Integer> numberList = Arrays.asList(1,2,1,3,3,2,4);

		//numberList를 stram으로 변경해 짝수만 걸러낸 후, 중복요소를 제거 하고 리스트로 변환
		List<Integer> evenList= numberList.stream()
				  						  .filter((number)-> number%2==0)
				  						  .distinct()
				  						  .collect(Collectors.toList());
		System.out.println(evenList);

findAny

//칼로리가 1200미만인 요리중 아무거나 하나 가져오기
		Optional<DishVO> anyDish= dishes.parallelStream()
			  .filter((dish)->dish.getCalories()<1200)
			  .findAny();
		DishVO one=anyDish.get();
		System.out.println(one.getName()+"\n"+
						   one.getCalories());
//		칼로리가 100 미만인 요리중 아무거나 하나 가져와라 
		Optional<DishVO> anyLowCaloryDish= 
				dishes.parallelStream()
				      .filter((dish)->dish.getCalories()<100)
				      .findAny();
			DishVO lowCaloryDish=anyLowCaloryDish
					  .orElse(new DishVO("SimpleFood", 10, "OTHER"));
			System.out.println(lowCaloryDish.getName()+"\n"+
					lowCaloryDish.getCalories());
			
//칼로리가 500미만인 요리중 아무거나 하나 가져와라 
		 anyLowCaloryDish= 
					dishes.parallelStream()
					      .filter((dish)->dish.getCalories()<500)
					      .findAny();
			lowCaloryDish=anyLowCaloryDish
						  .orElse(new DishVO("SimpleFood", 10, "OTHER"));
				System.out.println(lowCaloryDish.getName()+"\n"+
						lowCaloryDish.getCalories());

정리

  • stream : 내부 반복자
  • parallelStream : 병렬처리를 하는 내부 반복자(데이터의 수가 매우 많을때 사용)
  • filter : stream내의 데이터를 정제하는 것(파라미터 ->boolean 반환)- Predicate
  • map : steam내의 데이터 형태를 변경하는 것(파라미터 -> 변경된 값 반환) -Function
  • flatMap(활용도 낮음) 함수 내에서 만들어진 다른형태의 stream을 원본 스트림으로 변환- Function
  • distinct : stream 내부 데이터 중 중복된 값만 제거
  • sort: 정렬
  • count : stream 내부의 요소 개수를 세어주는 최종함수
  • forEach : stream 내부의 값을 반복해주는 최종함수.
  • collect : stream 내부의 값을 List,Map,Set,Grouping을 해주는 최종함수.
  • findAny : stream 내부의 값 중 아무거나 하나를 반환시키는 최종 함수(Optional)
  • findFirst : stream 내부의 값 중 가장 첫 번째 요소를 반환시키는 최종 함수(Optional)
  • peak : stream 내부의 값을 임시로 출력하고자 할 때 사용되는 함수(forEach와 동일)
  • limit : stream 내부의 값을 원하는 개수 만큼 선착순으로 가져오는 함수
  • skip : stream 내부의 값 중 앞에서 부터 원하는 개수만큼 건너띄는 함수.

0개의 댓글