ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [더 자바8] STREAM API
    JAVA/JAVA8 관련 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);
    
        }
    }
Designed by Tistory.