Stream API 연습하기

Bruce Han·2023년 2월 11일
0

Java8-정리

목록 보기
8/20
post-thumbnail

이 포스팅의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성한 것입니다.

자주 쓰는 Stream API 기능들

실습에 앞서, 과목번호(id), 과목명(subject), 개강여부(closed) 필드가 있는 SchoolClass 라는 클래스를 만들고, 이를 main()에서 ArrayList로 생성된 List 객체를 만들어 프로그래밍클래스(programmingClass), 이론클래스(theoryClass)의 데이터들을 추가한다.
밑에는 brucehan이 들을 bruceEvent라는 List형 객체를 만들어 프로그래밍/이론 클래스 각각을 추가했다.

List<SchoolClass> programmingClass = new ArrayList<>();
programmingClass.add(new SchoolClass(1, "JSP programming", true));
programmingClass.add(new SchoolClass(2, "C programming", true));
programmingClass.add(new SchoolClass(3, "Java programming", false));
programmingClass.add(new SchoolClass(4, "Android programming", false));
programmingClass.add(new SchoolClass(5, "React programming", false));

List<SchoolClass> theoryClass = new ArrayList<>();
theoryClass.add(new SchoolClass(6, "Operation System", true));
theoryClass.add(new SchoolClass(7, "Database", true));
theoryClass.add(new SchoolClass(8, "software engineering", false));

List<List<SchoolClass>> bruceEvents = new ArrayList<>();
bruceEvents.add(programmingClass);
bruceEvents.add(theoryClass);

걸러내기

1) J가 포함되는 과목

programmingClass.stream()
                .filter(sc -> sc.getSubject().contains("J"))
                .forEach(sc -> System.out.println(sc.getSubject()));
                // 과목 번호를 원한다면 sc.getId()로 변경

streamapi1

2) closed되지 않은 과목

programmingClass.stream()
                .filter(sc -> sc.!isClosed()) // 안 닫혔니?
                .forEach(sc -> System.out.println(sc.getSubject()));
                /*
                * .filter(sc -> sc.!isClosed()) 대신에
                * .filter(Predicate.not(SchoolClass::isClosed))도 가능
                */

streamapi2

3) 과목 이름 모아서 스트림 만들기

programmingClass.stream()
                .map(sc -> sc.getSubject()) // String 타입으로 매핑(변경)
                .forEach(sc -> System.out.println(sc));
programmingClass.stream()
				.map(SchoolClass::getSubject) // String 타입으로 매핑(변경)
                .forEach(System.out::println);

streamapi3

변경하기

변경할 때는 flatMap이라는 중계 오퍼레이션을 쓸 것이다.

streamapi4

두 과목 목록에 들어있는 모든 수업 id값 출력

flatmap은 List< SchoolClass > 타입을 받는다.

bruceEvents.stream()
			.flatMap(Collection::stream) // flatten
            // .flatMap(list -> list.stream())도 가능
            .forEach(sc -> System.out.println(sc.getId())); // 여기서부터는 SchoolClass 타입이 옴            

streamapi5

생성하기

10부터 1씩 증가하는 무제한 stream 중에서 앞의 10개를 빼고 최대 10개까지만 출력

이는 Stream의 iterate()를 활용해서 구현할 수 있다.

streamapi6

// iterate()는 중계 operation이기 때문에 실행하면 아무 일도 일어나지 않음
Stream.iterate(10, i -> i+1) // 여기까지는 무제한 스트림

제한하기

skip과 limit으로 출력할 개수를 제한한 후 20~29까지의 값을 출력한다.

streamapi7

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

anyMatch()를 통해서 어떤 거라도 특정 조건을 만족하는 데이터를 담고 있는지 확인하고자 한다.

streamapi8

프로그래밍 과목 중에서 J로 시작하는 제목의 과목들을 모아서 List로 만들기

map()으로 먼저 과목의 제목을 모을 수도 있고, filter()를 통해서 먼저 거를 수도 있다.

filter()로 먼저 거르기

List<String> collect = programmingClass.stream()
                .filter(sc -> sc.getSubject().startsWith("J"))
                .map(SchoolClass::getSubject) // .map(sc -> sc.getSubject())
                .collect(Collectors.toList());
        collect.forEach(System.out::println);

streamapi9

map()으로 먼저 모으기

List<String> collect = programmingClass.stream()
                .map(SchoolClass::getSubject) // .map(sc -> sc.getSubject())
                .filter(s -> s.startsWith("J")) // map에서 먼저 String들을 모아왔기에 바로 조건을 걸 수 있음
                .collect(Collectors.toList());
        collect.forEach(System.out::println);

streamapi10

정리

Stream API

  • 걸러내기

    • filter(Predicate)
    • ex) 운동 종목이 3글자 이상인 데이터만 새로운 스트림으로
  • 변경하기

    • map(Function) 혹은 flatMap(Function)
    • ex) 각각의 Post 인스턴스에서 String subject만 새로운 스트림으로
  • 생성하기

    • generate(Supplier) 혹은 Iterate(T seed, UnaryOperator)
    • ex) 10부터 1씩 증가하는 무제한 숫자 스트림
    • ex) 랜덤 int 무제한 스트림
  • 제한하기

    • limit(long)또는 skip(long)
    • ex) 최대 10개의 요소가 담긴 스트림을 리턴한다.
    • ex) 앞에서 10개를 스킵하고(10개를 뺀), 나머지 스트림을 리턴한다.
  • 스트림에 있는 데이터가 특정 조건을 만족하는지 확인

    • anyMatch(), allMatch(), nonMatch()
    • ex) k로 시작하는 문자열이 있는지 확인한다. (true 또는 false를 리턴한다.)
    • ex) 스트림에 있는 모든 값이 10보다 작은지 확인한다.
  • 개수 세기

    • count()
    • ex) 25보다 작은 수의 개수를 센다.
  • 스트림을 데이터 하나로 뭉치기

    • reduce(String identity, BiFunction), collect(), sum(), max()
    • ex) 모든 숫자 합 구하기
    • ex) 모든 데이터를 하나의 List 또는 Set에 옮겨 담기

Reference

profile
만 가지 발차기를 한 번씩 연습하는 사람은 두렵지 않다. 내가 두려워 하는 사람은 한 가지 발차기를 만 번씩 연습하는 사람이다. - Bruce Lee

0개의 댓글