스트림의 중간연산
스트림 자르기 - 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.distinct().forEach(System.out::print); // 123456
/*--------------------*/
IntStream intStream = IntStream.rangeClosed(1, 10); //12345678910
intStream.filter(i-> i%2==0).forEach(System.out::print); // 246810
/*--------------------*/
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 comparator) //지정된 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);
- 추가 정렬 기준을 제공할 때는 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);
예제
class Test{
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 toString() {
return String.format("[%s, %d, %d]", name, ban, totalScore);
}
String getName() {return name;}
int getBan() {return ban; }
int getTotalScore() {return totalScore;}
public int compareTo(Student s)
{
return s.totalScore - thus.totalScore;
}
}