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