[더 자바, Java8] 3. Stream

출처 ‣ 더 자바 Java 8, 백기선 / 인프런

3. Stream

연속된 데이터를 처리하는 함수. 파이프라인.

List<String> names = new ArrayList();
names.add("esjo");
names.add("joe");
names.add("cho");

Stream<String> stringStream = names.stream().map(String::toUpperCase); // stream을 리턴

names.forEach(System.out::println); // output → esjo joe cho *데이터는 변경되지 않는다.

1) operator

a. 중계(intermediate)오퍼레이션 = stream을 리턴 ex. map

  • lazy하다 = 종료(terminal) 오퍼레이션 이 올때 까지 실행하지 않음
// 중계
names.stream().map((s) -> {
		System.out.println(s); // print안됨!
		return s.toUpperCase();
});

// 중계 + 종료
names.stream().map((s) -> {
		System.out.println(s); // 출력됨
		return s.toUpperCase();
}).collect(Collectors.toList); // return List

b. 종료(terminal) 오퍼레이션 ex. Collect

3.1 parallelStream

  • 다른 쓰레드에서 돌아감
  • 병렬이라고 좋지만은 않음. 쓰레드 만들고 수집 비용. 컨텍스트 스위칭 비용.
  • 단, 데이터가 방대한 경우는 추천
List<String> collect = names.parallelStream().map((s) -> {
		System.out.println(s + " [Thread name] > " + Thread.currentThread().getName());
		return s.toUpperCase();
}).collect(Collectors.toList());

collect.forEach(System.out::println);

// output 
cho [Thread name] > ForkJoinPool.commonPool-worker-5
joe [Thread name] > main
esjo [Thread name] > ForkJoinPool.commonPool-worker-3
ESJO
JOE
CHO

3.2 Stream API

3.2.1 예제

https://github.com/eunsolJo/algorithm-study/commit/273fad333fa755b01ae475a4e2e33e38de2bc529

3.3.1 풀이

https://github.com/eunsolJo/algorithm-study/commit/e8cee6d3f92748bc85cc0c850502569d4e2f4f18

package java8.streamtest;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class App {
    public static void main(String[] args) {
        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>> eunsolEvents = new ArrayList<>();
        eunsolEvents.add(springClasses);
        eunsolEvents.add(javaClasses);

        System.out.println("1. spring 으로 시작하는 수업");
        eunsolEvents.stream().flatMap(e -> e.stream())
                .filter(e -> e.getTitle().startsWith("spring"))
                .forEach(System.out::println);

        System.out.println("\n2. close 되지 않은 수업");
        eunsolEvents.stream().flatMap(e -> e.stream())
                .filter(e -> e.isClosed() == false)
                .forEach(System.out::println);
        // Predicate 함수형 인터페이스의 not 사용 + 메소드 레퍼런스
        eunsolEvents.stream().flatMap(e -> e.stream())
                .filter(Predicate.not(OnlineClass::isClosed))
                .forEach(System.out::println);

        System.out.println("\n3. 수업 이름만 모아서 스트림 만들기");
        eunsolEvents.stream().flatMap(e -> e.stream())
                .map(OnlineClass::getTitle)
                .forEach(System.out::println);

        System.out.println("\n4. 두 수업 목록에 들어있는 모든 수업 아이디 출력");
        eunsolEvents.stream().flatMap(e -> e.stream())
                .map(OnlineClass::getId)
                .forEach(System.out::println);

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

        System.out.println("\n6. 자바 수업 중에 Test가 들어있는 수업이 있는지 확인");
        boolean hasTest = eunsolEvents.stream()
                .flatMap(e -> e.stream())
                .anyMatch(e -> e.getTitle().indexOf("Test") != -1);
        System.out.println(hasTest); // true

        System.out.println("\n7. 스프링 수업 중에 제목에 spring이 들어간 것만 모아서 List로 만들기");
        List<OnlineClass> spring = eunsolEvents.stream()
                                            .flatMap(e -> e.stream())
                                            .filter(e -> e.getTitle().startsWith("spring"))
                                            .collect(Collectors.toList());
        spring.forEach(System.out::println);

    }
}

좋은 웹페이지 즐겨찾기