JAVA/JAVA8 관련

[더 자바8] STREAM API

JUMP개발자 2022. 3. 20. 16:49

Stream

자바 8에서 추가된 스트림(Stream)은  람다를 활용할 수 있는 기술중 하나이다.

스트림은 '데이터의 흐름'으로, 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있다.

public class App {

    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("jump");
        names.add("jumplope");
        names.add("ff");
        names.add("gg");

        Stream<String> stringStream = names.stream().map(String::toUpperCase);
        stringStream.forEach(System.out::println);
        System.out.println("===========================");
    }
}

결과

JUMP
JUMPLOPE
FF
GG
===========================

 

operator

- 중계(intermediate)오퍼레이션 : stream을 리턴함.

중계 오퍼레이션을 LAZY하다라고 하는데, 종료 오퍼레이션이 올때까지 실행하지 않음.

 List<String> collect = names.stream().map((s)-> {
            System.out.println(s); // 출력 X
            return s.toUpperCase();
        });
    
List<String> collect = names.stream().map((s)-> {
            System.out.println(s); // 출력 O
            return s.toUpperCase();
        }).collect(Collectors.toList());

-종료(terminal) 오퍼레이션 : ex:) collect

parallelStream

- 여러 쓰레드에서 돌아감

- 병렬이라고 무조건 좋지는 않음. (쓰레드 만들고 수집하는 비용)

- 데이터가 방대한 경우에는 추천

  List<String> collect = names.parallelStream().map((s) -> {
            System.out.println(s + " [Thread name] > " + Thread.currentThread().getName());
            return s.toUpperCase();
        }).collect(Collectors.toList());

결과 

jump [Thread name] > ForkJoinPool.commonPool-worker-23
jumplope [Thread name] > ForkJoinPool.commonPool-worker-19
ff [Thread name] > main
gg [Thread name] > ForkJoinPool.commonPool-worker-5

 

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));

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

        System.out.println("close 되지 않은 수업");
        springClasses.stream().filter(oc->!oc.isClosed())
                .forEach(oc->System.out.println(oc.getId()));
        // 같음
        springClasses.stream().filter(Predicate.not(OnlineClass::isClosed))
                .forEach(oc->System.out.println(oc.getId()));


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

        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>> jumpEvents = new ArrayList<>();
        jumpEvents.add(springClasses);
        jumpEvents.add(javaClasses);

        System.out.println("두 수업 목록에 들어있는 모든 수업 아이디 출력");
        // TODO
        jumpEvents.stream().flatMap(Collection::stream)
                .forEach(oc->System.out.println(oc.getId()));
        System.out.println("10부터 1씩 증가하는 무제한 스트림 중에서 앞에 10개 빼고 최대 10개 까지만");
        // TODO
        Stream.iterate(10,i->i+1)
                .skip(10)
                .limit(10)
                .forEach(System.out::println);
        System.out.println("자바 수업 중에 Test가 들어있는 수업이 있는지 확인");
        // TODO
        boolean test= javaClasses.stream().anyMatch(oc -> oc.getTitle().contains("Test"));
        System.out.println(test);

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

    }
}