korjun1993 / cs-book-study

책을 읽고 토론하며 컴퓨터과학을 공부하는 공간
0 stars 1 forks source link

스트림의 중간 연산 #42

Open korjun1993 opened 1 year ago

korjun1993 commented 1 year ago

출처: 자바의 정석 823~

  1. 스트림 자르기
    • skip(long n): 스트림의 일부 요소를 건너뜀
    • limit(long maxSize): 스트림의 요소를 maxSize개로 제한
  2. 스트림 요소 걸러내기
    • filter(Predicate<? super T> predicate): 주어진 조건(Predicate)에 맞는 요소만 걸러냄
    • distinct(): 중복된 요소들을 제거
  3. 정렬
    • Stream<T> sorted() → 기본 정렬 기준(Comparable)으로 정렬
    • Stream<T> sorted(Comparator<? super T> comparator)
  4. 변환
    • Stream<R> map<Function<? super T, ? extends R> mapper
    • 스트림 요소에 저장된 값 중에서 원하는 필드만 뽑아내거나 특정 형태로 변환해야 할 때 사용
Stream<File> fileStream = Stream.of(new File("Ex1.java"), new File("Ex1.bak"));
Stream<String> filenameStream = fileStream.map(File::getName);
  1. 기본형 변환

    • Stream 타입의 스트림을 기본형 스트림으로 변환할 때 사용
    • mapToDouble(ToDoubleFunction<? super T> mapper> mapper)`
    • mapToInt(ToIntFunction<? super T> mapper> mapper)`
    • mapToLong(ToLongFunction<? super T> mapper> mapper)`
    • count()만 지원하는 Stream<T>와 달리 기본형 스트림은 숫자를 다루는데 편리한 메서드를 제공한다.
    • sum()
    • average()
    • max()
    • min()
  2. 기본형 스트림 → Stream<T> 변환

    • IntStream을 Stream<T>로 변환할 때는 mapToObj()를 사용한다.
    • IntStream을 Stream<Integer>로 변환할 때는 boxed()를 사용한다.
  3. 조회

    • 연산과 연산 사이에 동작하는 로직
    • forEach()와 달리 스트림의 요소를 소모하지 않으면서 연산 사이에 여러 번 끼워 넣을 수 있다.
fileStream.map(File::getName).filter(s -> s.indexOf('.' != -1) // 확장자가 없는 것은 제외
    .peek(s -> System.out.printf("filename=%s%n", s))) // 파일명 출력
    .map(s -> s.substring(s.indexOf('.') + 1)) // 확장자 추출
    .peek(s -> System.out.printf("extension=%s%n", s)) // 확장자 출력
    .forEach(System.out::println);
  1. Stream<T[]>Stream<T> 변환
    
    Stream<String[]> strArrStream = Stream.of(
    new String[]{"abc", "def", "ghi"},
    new String[]{"ABC", "GHI", "JKLMN"}
    )

Stream strStream = strArrStream.flatMap(Arrays::stream);


참고 사항
- Comparator의 default 메서드
   - reversed()
   - thenComparing(Comparator<T> other)
   - thenComparing(Function<T, U> keyExtractor)
   - thenComparing(Function<T, U> keyExtractor, Comparator<U> keyComp)
   - thenComparingInt(ToIntFunction<T> keyExtractor)
- Comparator의 static 메서드
   - Comparator naturalOrder()
   - Comparator reverseOrder()
   - Comparator comparing(Function<T, U> keyExtractor)
   - Comparator comparing(Function<T, U> keyExtractor, Comparator<T> keyComp)
   - Comparator comparingInt(ToIntFunction<T> keyExtractor)
   - nullsFirst(Comparator<T> comparator)
   - nullsLast(Comparator<T> comparator)

```java
// 학생 스트림을 반별, 성적순, 이름순으로 출력
studentStream.sorted(Comparator.comparing(Student::getBan)
            .thenComparing(Student::getTotalScore)
            .thenComparing(Student::getName))
            .forEach(System.out::println);