본문 바로가기
스프링 스터디 (인프런)/더 자바 8

Stream - Stream API

by 백엔드 개발자 2023. 4. 14.

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에 옮겨 담기

 

오퍼레이터의 순서에 따라 지나가는 타입이 달라질 수 있으므로 유의해야 한다.