[자바의 정석] 14. 람다와 스트림 - 스트림의 중간 연산(1/7)~(4/7)

jyleever·2022년 10월 5일
0

자바의 정석

목록 보기
11/12
post-thumbnail

스트림의 중간 연산

스트림 자르기 - skip(), limit()

Stream<T> skip(long n) // 앞에서부터 n개 건너뛰기
Stream<T> limit(long maxSize) // maxSize 이후의 요소는 잘라냄
IntStream intStream = IntStream.rangeClosed(1, 10)
// 12345678910
intStream.skip(3).limit(5).forEach(System.out::print);
// 45678

스트림의 요소 걸러내기 - filter(), distinct()

Stream<T> filter(Predicate predicate조건식) // 조건에 맞지 않는 요소 제거
Stream<T> distinct() // 중복 제거
IntStream intStream = IntStream.of(1,2,2,3,3,3,4,5,5,6)
intStream.dictinct().forEach(System.out::print); // 123456
IntStream intStream = IntStream.rangeClosed(1, 10); // 12345678910
intStream.filter(i -> i % 2 == 0).forEach(System.out::print); // 246810

filter()는 중간 연산이므로 여러 번 사용할 수 있다.

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);
    // filter 여러 번 사용 가능 -> 2의 배수가 아닌 것 && 3의 배수가 아닌 것 

스트림 정렬하기 - sorted()

정렬할 때 필요한 것
1. 정렬 대상
2. 정렬 기준

Stream<T> sorted() // 스트림 요소의 기본 정렬(Comparable)로 정렬
Stream<T> sorted(Comparator comparator) // 지정된 Comparator로 정렬

strStream.sorted(s1, s2) -> s1.compareTo(S2));
메소드 참조로 바꿀 수 있다.
참조변수.compareTo(변수)
compareTo 인스턴스 메서드

Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();

  • 자주 쓰는 Comparator , 대소문자 구분 안 함

Comparator의 comparing()으로 정렬 기준을 제공

comparing(Function<T, U> keyExtractor)
comparing(Function<T, U> keyExtractor, Comparator<U> keyComparator
studentStream.sorted(Comparator.comparing(Student::getBan)
		.forEach(System.out::println); // 반별로 정렬

Student::getBan
== (Student s) -> s.getBan()

Stream<T> sorted(Comparator comparator)

sorted 메소드는 매개변수로 Comparator을 필요로 함.
그리고 메소드의 반환 타입이 Comparator
즉, sorted 의 매개변수로 Comparator을 넣어야 함

추가 정렬 기준을 제공할 때에는 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(Stduent::getName) // 이름 별로 정렬
                .forEach(System.out::println);

예제

자바의 정석 책 p.816

0개의 댓글