2020-10-15 더자바 강의정리 스트림

스트림

  • 데이터를 담는 컬렉션이 아니다.

  • 중개 operator와 종료 opeartor로 나눌 수 있다.

  • Functional in nature. 근본적으로 함수형이고 소스를 변경하지 않는다.

  • stream을 이용한 연산의 결과는 또 다른 스트림이 되고, 저장되지는 않는다.

  • 스트림으로 지나간 데이터는 1번만 처리된다.

  • ShortCircuit으로 제한할 수 있다.

  • 중개 operation들은 기본적으로 Lazy

  • 손쉽게 병렬처리할 수 있다.

  • 중개opeartion은 스트림을 리턴하고, 종료 operator는 다른 타입을 리턴한다.

  • 종료형 opeartor가 실행되기전에 중개 opeartor가 무의미하다.

  • public class Java8App {
      public static void main(String[] args) {
        List<String> name = new ArrayList<>();
        name.add("kee");
        name.add("whiteship");
        name.add("jimmy");
        name.add("toby");
        name.add("jay");
    
        List<String> collect = name.parallelStream().map(s -> {
          System.out.println(s + " " + Thread.currentThread().getName());
          return s.toUpperCase();
        }).collect(Collectors.toList());
    
        System.out.println("====");
        collect.forEach(System.out::println);
      }
    }
    
    // result
    jay ForkJoinPool.commonPool-worker-3
    toby ForkJoinPool.commonPool-worker-3
    kee ForkJoinPool.commonPool-worker-7
    jimmy main
    whiteship ForkJoinPool.commonPool-worker-5
    ====
    KEE
    WHITESHIP
    JIMMY
    TOBY
    JAY
    
    • 병렬처리한다고 유용한건 아니다.

스트림 파이프라인

  • 0 또는 다수의 중개 오퍼레이션과 한개의 종료오퍼레이션으로 구성
  • 스트림의 데이터 소스는 오직 터미널 오퍼레이션을 실행할 때만 처리

중개 오퍼레이션

  • Stream을 리턴
  • Stateless, Statefull 오퍼레이션으로 더 상세하게 구분할 수 있다.
  • filter, map, limit, skip, sorted…

종료 오퍼레이션

  • Stream을 리턴하지 않는다.
  • collect, allMatch, count, forEach, min, max…
public class Java8App {
  public static void main(String[] args) {
    List<Book> bookList = new ArrayList<>();
    bookList.add(new Book(1, "HTTP 완벽 가이드", "HTTP", true, 10000));
    bookList.add(new Book(2, "Hello 알고리즘", "알고리즘", false, 1000));
    bookList.add(new Book(3, "JPA 프로그래밍", "JPA", false, 5000));
    bookList.add(new Book(4, "리팩토링 ", "reafactoring", true, 100000));
    bookList.add(new Book(5, "HTTP 그림", "HTTP", true, 10000));

    System.out.println("====================번역이 안된 서적들====================");
    bookList.stream()
      .filter(Predicate.not(Book::isTranslate))
      .forEach(System.out::println);

    System.out.println("====================제목만 가지고 스트림 만들기====================");
    bookList.stream()
      .map(book -> book.getTitle())
      .forEach(System.out::println);


    System.out.println("====================Flat Map====================");
    List<List<Book>> innerBook = new ArrayList<>();
    innerBook.add(bookList);
    innerBook.stream().flatMap(Collection::stream)
      .forEach(book -> System.out.println(book.getTitle()));

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

    System.out.println("수업중에 특정 있는지");
    boolean check = bookList.stream().anyMatch(book -> book.getTitle().contains(" "));
    System.out.println("check : " + check);

    System.out.println("특정 단어가 들어간 리스트 만들기");
    List<String> tmpList = bookList.stream().filter(book -> book.getTitle().contains("HTTP"))
      .map(Book::getTitle)
      .collect(Collectors.toList());
    tmpList.forEach(System.out::println);
  }
}

느낀점

  • 알고리즘을 풀다가 가끔 스트림을 쓰는 경우가 있었고, int []를 List와 같이 변경해야되는 경우들이 있었다. 이때마다 for문을 이용해서 변경했었지만, 자바8을 검색해보면 항상 mapToInt와 Collect 메서드들이 나왔고 copy and paste만하다가 이 강의를 통해 어느정도 활용할 수 있어서 다행이다.
Written on October 15, 2020