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+"]";
}
}
'Java' 카테고리의 다른 글
146. Optional<T> - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.12 |
---|---|
145. 스트림의 중간연산(2) - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.11 |
143. 스트림의 연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |
142. 스트림만들기 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |
141. 스트림, 스트림의 특징 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |