1. Stream API
걸러내기
스트림 내부의 파이프라인을 생각해보면 현재 OnlineClass형 객체를 리스트로 저장하고 있는 것이 springClasses라는 변수이므로,
List<OnlineClass> springClasses = new ArrayList<>();
스트림에는 온라인클래스 객체들이 지나가게 된다.
사진을 보면 중계 오퍼레이션으로 filter를 사용해서 spring으로 시작하는 타이틀을 걸러내도록 했다.
그래서 1~4번까지 id만이 걸러져서 출력되는 것을 확할 수 있다.
Predicate 및 메서드 래퍼런스 활용
임의의 객체의 인스턴스 메서드인 경우의 래퍼런스를 활용해서
Oneline::isClosed로 표현.
또한 not을 표현하기 위해서 Predicate.not을 활용한다.
그래서 isClosed가 되지 않은 수업만을 걸러낸다.
● Filter(Predicate)
● 예) 이름이 3글자 이상인 데이터만 새로운 스트림으로
변경하기
stream()의 map 오퍼레이션은 기존의 파이프라인을 통과하는 객체(여기서는 OnlineClass)를 다르게 변환시키는 것이다.
System.out.println("수업 이름만 모아서 스트림 만들기");
/* springClasses.stream().map(oc -> oc.getTitle())
.forEach(s -> System.out.println(s));*/
springClasses.stream().map(OnlineClass::getTitle)
.forEach(System.out::println);
map의 조건으로 이름만 모아서 String객체를 만들었고, forEach로 전부 출력했다.
● Map(Function) 또는 FlatMap(Function)
List<List<OnlineClass>> keesunEvents = new ArrayList<>();
keesunEvents.add(springClasses);
keesunEvents.add(javaClass);
keesunEvents는 리스트안에 리스트를 담고 있는 형식이다.
여기서 FlatMap을 사용하게 되면 OnlineClass를 담는 리스트들이
내부의 OnlineClass객체들을 전부 꺼내서 소켓통신처럼 일자로 나열하는 것처럼 변한다.
System.out.println("두 수업 목록에 들어있는 모든 수업 아이디 출력");
keesunEvents.stream().flatMap(Collection::stream)// flat 시키기위해 list -> list.stream() 작성
.forEach(onlineClass -> System.out.println(onlineClass.getId()));//여기서부터 OnlineClass 객체가 지나가는 상황.
// 왜냐하면 flat하게 만들었기 때문이다.
flatMap내부에 람다식 진행 후 forEach로 onlineClass 객체들을 람다식으로 출력.
(flatMap 내부 람다식 확인필요.)
● 예) 각각의 Post 인스턴스에서 String title만 새로운 스트림으로
● 예) List<Stream<String>>을 String의 스트림으로
생성하기
● generate(Supplier) 또는 Iterate(T seed, UnaryOperator)
System.out.println("10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만");
Stream.iterate(10, integer -> integer + 1)
.skip(10)
.limit(10)
.forEach( integer -> System.out.println(integer));
● 예) 10부터 1씩 증가하는 무제한 숫자 스트림
● 예) 랜덤 int 무제한 스트림
제한하기
● limit(long) 또는 skip(long)
● 예) 최대 5개의 요소가 담긴 스트림을 리턴한다.
● 예) 앞에서 3개를 뺀 나머지 스트림을 리턴한다.
스트림에 있는 데이터가 특정 조건을 만족하는지 확인
System.out.println("자바 수업 중에 Test가 들어있는 수업이 있는지 확인");
boolean test = javaClass.stream().anyMatch(oc -> oc.getTitle().contains("Test"));
System.out.println(test);
● anyMatch(), allMatch(), nonMatch()
● 예) k로 시작하는 문자열이 있는지 확인한다. (true 또는 false를 리턴한다.)
● 예) 스트림에 있는 모든 값이 10보다 작은지 확인한다.
개수 세기
● count()
● 예) 10보다 큰 수의 개수를 센다.
스트림을 데이터 하나로 뭉치기
System.out.println("스프링 수업 중에 제목에 spring이 들어간 제목만 모아서 List로 만들기");
List<String> spring = springClasses.stream().filter(oc -> oc.getTitle().contains("spring"))//필터로 제목에 spring이 들어간 OnlineClass 객체를 필터링.
.map(OnlineClass::getTitle)//필터링한 객체들의 제목만 모아서 map으로 형태변환
.collect(Collectors.toList());//리스트로 변환
spring.forEach(System.out::println);
filter로 spring이 들어간 OnlineClass 객체를 필터링한다.
map으로 제목 데이터만 모은다.
collect로 리스트 변환한다.
● reduce(identity, BiFunction), collect(), sum(), max()
● 예) 모든 숫자 합 구하기
● 예) 모든 데이터를 하나의 List 또는 Set에 옮겨 담기
오퍼레이터의 순서에 따라 지나가는 타입이 달라질 수 있으므로 유의해야 한다.
'스프링 스터디 (인프런) > 더 자바 8' 카테고리의 다른 글
섹션 4. Optional-Optional API (0) | 2023.04.24 |
---|---|
섹션 4. Optional-Optional 소개 (0) | 2023.04.20 |
Stream - Stream 소개 (0) | 2023.04.09 |
인터페이스의 변화 - 자바 8 API의 기본 메소드와 스태틱 메소드 (0) | 2023.04.08 |
인터페이스의 변화 - 인터페이스 기본 메소드와 스태틱 메소드 (0) | 2023.04.08 |