Java

144. 스트림의 중간연산 - 패스트캠퍼스 백엔드 부트캠프 3기

gkss2tpt 2025. 1. 10. 16:49

1. 스트림의 중간연산

  • 스트림 자르기 - skip(), limit()
Stream<T> skip(long n)		// 앞에서부터 n개 건너뛰기
Stream<T> limit(long maxSize)	// maxSize 이후의 요소는 잘라냄

IntStream intStream = IntStream.rangeClosed(1, 10);	// 1~10, 10포함
intStream.skip(3).limit(5).forEach(System.out::print);	// 45678
  • 스트림의 요소 걸러내기 - filter(), distinct()
Stream<T> filter(Predicate<? super T> predicate)	// 조건에 맞지 않는 요소 제거
Stream<T> distinct()					// 중복제거

IntStream intStream = IntStream.of(1,2,2,3,3,3,4,5,5,6);
intStream.distinct().forEach(System.out::print);	// 123456	중복제거

IntStream intStream = IntStream.rangeClosed(1, 10);	// 12345678910
intStream.filter(i->i%2==0).forEach(System.out::print);	// 246810

// 2와 3의 배수가 아닌것만 1,5,7
intStream.filter(i->i%2!=0 && i%3!=0).forEach(System.out::print);	
intStream.filter(i->i%2!=0).filter(i->i%3!=0).forEach(System.out::print);;
  • 스트림 정렬하기 - sorted()
Stream<T> sorted()		// 스트림 요소의 기본 정렬(Comparable)로 정렬
Stream<T> sorted(Comparator<? super T> comparator)	// 지정된 Comparator로 정렬
문자열 스트림 정렬 방법 출력결과
strStream.sorted()                                                  // 기본 정렬
strStream.sorted(Comparator.naturalOrder());      // 기본 정렬
strStream.sorted((s1,s2) -> s1.compareTo(s2));   // 람다식도 가능
strStream.sorted(String::compareTo);                  // 위의 문장과 동일
CCaaabccdd
strStream.sorted(Comparator.reverseOrder())     // 기본정렬의 역순
strStream.sorted(Comparator.<String>naturalOrder().reversed())
ddccbaaaCC
strStream.sorted(String.CASE_INSENSITIVE_ORDER)  // 대소문자 구분안함 aaabCCccdd
strStream.sorted(String.CASE_INSENSITIVE_ORDER.reversed()) ddCCccbaaa
strStream.sorted(Comparator.comparing(String::length))    // 길이 순 정렬
strStream.sorted(Comparator.comparingInt(String::length)) // no오토박싱
bddCCccaaa
strStream.sorted(Comparator.comparing(String::length).reversed()) aaaddCCccb
  • Comparator의 comparing()으로 정렬 기준을 제공
comparing(Function<T, U> keyExtractor)
comparing(Function<T, U> keyExtractor, Comparator<U> keyComparator)

// (Student s) -> s.getBan();
studentStream.sorted(Comparator.comparing(Student::getBan))	// 반별로 정렬
				.forEach(System.out::println);
  • 추가 정렬 기준을 제공할 때는thenComparing()을 사용
thenComparing(Comparator<T> other)
thenComparing(Function<T, U> keyExtractor)
thenComparing(Function<T, U> keyExtractor), Comparator<U> keyComp)

studentStream.sorted(Comparator.comparing(Student::getBan)	// 반별로 정렬
                    .thenComparing(Student::getTotalScore)	// 총점별로 정렬
                    .thenComparing(Student::getName)		// 이름별로 정렬
                    .forEach(System.out::println);

 

2. 예제

import java.util.Comparator;
import java.util.stream.Stream;

public class Ex02_08 {
    public static void main(String[] args) {
        Stream<Student> studentStream = Stream.of(
                new Student("이자바",3,300),
                new Student("김자바",1,200),
                new Student("안자바",2,100),
                new Student("박자바",2,150),
                new Student("소자바",1,200),
                new Student("나자바",3,290),
                new Student("감자바",3,180)
        );

        studentStream.sorted(Comparator.comparing(Student::getBan) // 반별 정렬
                .thenComparing(Comparator.naturalOrder())) // 기본 정렬
                .forEach(System.out::println);
    }
}

class Student implements Comparable<Student> {
    String name;
    int ban;
    int totalScore;

    Student(String name, int ban, int totalScore) {
        this.name = name;
        this.ban = ban;
        this.totalScore = totalScore;
    }

    public String getName()     {return name;}
    public int getBan()         {return ban;}
    public int getTotalScore()  {return totalScore;}

    // 총점 내림차순을 기본 정렬로 한다.
    @Override
    public int compareTo(Student s) {
        return s.totalScore - this.totalScore;
    }

    @Override
    public String toString() {
        return "["+name+", "+ban+", "+totalScore+"]";
    }
}