스트림

GW·2023년 7월 31일

Stream이란?

  • 병렬처리를 지원하는 내부 반복자
  • 컬렉션이나 배여를 스트림으로 변환하여 여러가지 형태의 처리를 할 수 있다.
  • 반복문을 이용하던 기존의 컬렉션을 스트림으로 처리할 수 있다.
    스트림을 사용하는 이유
    1.정렬 , 필터링 , 맵핑 등을 통해 지저분하고 중복되던 반복문 코드가 사라짐
    2.데이터를 제어하는 주체가 RDB 에서 JAVA 로 옮겨짐
  • 이유
    • 데이터가 늘어남에 따라 데이터를 정제하는 RDB 능력의 한계가 드러남
    • 비정형 데이터를 RDB 에서 정제할 수 없음
public class BasicStream {
	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"));
		
		//Stream은 최종함수가 실행되기 전까지는 아무런 동작을 하지 않는다.
		dishes.stream()
		//filter는 조건식에 맞는 것드만 추려내는 방법.
			  .filter((dish)->{
				  System.out.println(">>"+dish.getCalories());
				  return dish.getCalories()<=1000;
						  })
			//Stream을 반환하지 않는 모든 함수들은 최종 함수다.
			  //Stram에서 최종함수가 실행될 경우, Stream은 재활용 할 수 없다.
			  .forEach((dish)->{
				  System.out.println(dish.getName());
				  System.out.println(dish.getCalories());
				  System.out.println(dish.getCategory());
			  }); 
			  
		//요리명이 5글자 이상인것만 출력해보기
		dishes.stream()
			  .filter((dish)->dish.getName().length()>=5)
			  .forEach((dish) ->{
				  System.out.println(":::"+dish.getName());
			  });
		
		//요리명이 5글자 미만인 것만 출력
		dishes.stream()
			.filter((dish)->dish.getName().length()<5)
			.forEach((dish)->{
				System.out.println("<<"+dish.getName());
			});
		//글자가 P로 시작하는 음식만 출력
		dishes.stream()
			  .filter((dish)->dish.getName().startsWith("P"))
			  .forEach((dish)->{
				  System.out.println("[]"+dish.getName());
			  });
		//Category 종류가 OTHER인거만 출력
		dishes.stream()
			  .filter((dish)->dish.getCategory().contains("OTHER"))
			  .forEach((dish)->{
				  System.out.println(dish.getName()+" "+
						             dish.getCalories()+" "+
						             dish.getCategory());
			  });
		
		long count=dishes.stream()
					     .filter((dish)->dish.getCalories()<500)
			             .count();
	    System.out.println(count);
		//500보가 칼로리가 큰 요리들중 요리명이 6자리 이상인것만 출력
	    dishes.stream()
	    	  .filter((dish)->dish.getCalories()>500&&dish.getName().length()>6)
	    	  .forEach((dish)->{
	    System.out.println("%"+dish.getCalories()+
	    		           dish.getName());
	    	  });
	    
	    //filter, foreach, count
	    //filter : 데이터를 필터링(Predicate(T) -> boolean) 중간함수
	    //forEach : 데이터를 반복 (Consumer: (T) -> void) 최종함수
	    //Count: 데이터의 개수 (파라미터 없음) 개수만 반환(long 타입) 최종함수
	    
		    //map: 데이터의 형태를 변경(Function:(T)-> R):(T를 주면 R로 반환) :중간함수
	    //각 요리의 이름을 요리명의 길이로 변경해 출력.
	    dishes.stream()
	    	  .map((dish) -> dish.getName().length()) //DishVO를 int로 바꾼다.
	    	  .distinct() //값이 같은 것들은 모두 제거한다.
	    	  .forEach((len)->{
	    		  System.out.println(len);
	    	  });
	
	
	}
}

0개의 댓글