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
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의 배수가 아닌 것
정렬할 때 필요한 것
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();
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(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