Holy Moly 2022. 3. 26. 19:07

사용할 Online Class의 spring, java, holyEvents 리스트 목록

List<OnlineClass> springClasses = new ArrayList<>();
springClasses.add(new OnlineClass(1, "spring boot", true));
springClasses.add(new OnlineClass(2, "spring data jpa", true));
springClasses.add(new OnlineClass(3, "spring mvc", false));
springClasses.add(new OnlineClass(4, "spring core", false));
springClasses.add(new OnlineClass(5, "rest api development", false));

List<OnlineClass> javaClasses = new ArrayList<>();
javaClasses.add(new OnlineClass(6, "The Java, Test", true));
javaClasses.add(new OnlineClass(7, "The Java, Code manipulation", true));
javaClasses.add(new OnlineClass(8, "The Java, 8 to 11", false));

List<List<OnlineClass>> holyEvents = new ArrayList<>();
holyEvents.add(springClasses);
holyEvents.add(javaClasses);

 

 

걸러내기

●   Filter(Predicate)
●   예) 이름이  3글자  이상인  데이터만  새로운  스트림으로 변경하기
●   Map(Function) 또는  FlatMap(Function)
●   예) 각각의  Post 인스턴스에서  String title만  새로운  스트림으로 

●   예) List<Stream<String>>을  String의  스트림으로

System.out.println("spring 으로 시작하는 수업");
// TODO
springClasses.stream().filter(oc -> oc.getTitle().startsWith("spring"))
        .forEach(oc -> System.out.println(oc.getId()));

filter를 통해 OnlineClass의 이름이 spring으로 시작하는지 걸러내기

 

System.out.println("close 되지 않은 수업");
// TODO
springClasses.stream().filter(oc-> !oc.isClosed())
        .forEach(oc-> System.out.println(oc.getId()));
// 메서드 참조 이용
System.out.println("==============");
springClasses.stream()
        .filter(Predicate.not(OnlineClass::isClosed))
        .forEach(oc-> System.out.println(oc.getId()));

filter를 통해 close되었는지 확인

메서드 참조 이용시 True, False를 구분하기 위해 Predicate.not메서드 이용

 

System.out.println("수업 이름만 모아서 스트림 만들기");
// TODO
springClasses.stream()
        .map(oc -> oc.getTitle())
        .forEach(s -> System.out.println(s));

System.out.println("==========");

springClasses.stream()
        .map(OnlineClass::getTitle)
        .forEach(System.out::println);

map을 이용하여 OnlineClass 타입을 String으로 변경한후 새로운 stream 생성

 

System.out.println("두 수업 목록에 들어있는 모든 수업 아이디 출력");
// TODO
holyEvents.stream().flatMap(Collection::stream)
        .forEach(oc -> System.out.println(oc.getId()));

flatMap을 이용하여 springClass와 javaClass를 가진 holyEvents의 stream을 생성


생성하기

●   generate(Supplier) 또는  Iterate(T seed, UnaryOperator) 

●   예) 10부터  1씩  증가하는  무제한  숫자  스트림
●   예) 랜덤  int 무제한  스트림 제한하기
●   limit(long) 또는  skip(long)
● 예) 최대 5개의 요소가 담긴 스트림을 리턴한다. 

● 예) 앞에서 3개를 뺀 나머지 스트림을 리턴한다.

System.out.println("10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만");
// TODO
Stream.iterate(10, i->i+1)
        .skip(10)
        .limit(10)
        .forEach(System.out::println);

iterate를 이용하여 1을 더하는 동작을 수행

skip을 이용하여 10개를 건너뜀

limit을 이용하여 10개만 사용


스트림에  있는  데이터가  특정  조건을  만족하는지  확인 

●   anyMatch(), allMatch(), nonMatch()
●   예) k로  시작하는  문자열이  있는지  확인한다. (true 또는  false를  리턴한다.) 

●   예) 스트림에  있는  모든  값이  10보다  작은지  확인한다.

System.out.println("자바 수업 중에 Test가 들어있는 수업이 있는지 확인");
// TODO
boolean test = javaClasses.stream()
        .anyMatch(oc -> oc.getTitle()
                .contains("Test"));
System.out.println("test = " + test);

anyMatch를 통해 자바 수업중에 "Test" 문자열이 있는 것을 확인


개수  세기 

●   count()
●   예) 10보다  큰  수의  개수를  센다. 스트림을  데이터  하나로  뭉치기
●   reduce(identity, BiFunction), collect(), sum(), max() ●   예) 모든  숫자  합  구하기
●   예) 모든  데이터를  하나의  List 또는  Set에  옮겨  담기

 

System.out.println("스프링 수업 중에 제목에 spring이 들어간 것만 모아서 List로 만들기");
// TODO
List<String> spring = springClasses.stream()
	// OnlineClass
        .filter(oc -> oc.getTitle().contains("spring"))
        .map(OnlineClass::getTitle)
        .collect(Collectors.toList());
spring.forEach(System.out::println);
System.out.println("==========");

spring = springClasses.stream()
        .map(OnlineClass::getTitle)
        // title
        .filter(title -> title.contains("spring"))
        .collect(Collectors.toList());
spring.forEach(System.out::println);

"spring" 문자열이 포함된 것만 모아서 List생성

map의 위치에 따라 filter에서 변수의 타입이 달라짐

 

 

 

 

코드참고: https://github.com/whiteship/java8/commit/12dcce9888bbb6dfbe002788d34a1485cbf4a9e6#diff-da174663cd600f7bc9510bf3a5547c94af9de23d1a0e93a35d6159da19b3c3d5