본문 바로가기

하../java

ch14 스트림의 중간연산

스트림 자르기 - 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<? supter T> predicate - 조건에 맞지 않는 요소 제거(조건식)
Stream<T> distinct() - 중복 제거 

IntStream.intStream = IntStream.of(1,2,2,3,3,3,4,5,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::printf); - 246810

intStream.filter(i->i%2!=0 && i%3!=0).forEach(System.out::printf); - 1,5,7
intStream.filter(i->i%2!=0).filter(i%3!=0).forEach(System.out::printf); -여러번도 가능

스트림 정렬하기 - sorted()

정렬 기본요소 1. 정렬대상 2. 정렬기준

Stream<T> sorted() - 스트림 요소의 기본 정렬(Comparable)로 정렬
Stream<T> sorted(Comparator<? super T> 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)
정렬 기준이 여러개
	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 - this.totalScore;
	}
}
결과값
[김자바, 1, 200]
[소자바, 1, 200]
[박자바, 2, 150]
[안자바, 2, 100]
[이자바, 3, 300]
[나자바, 3, 290]
[감자바, 3, 180]

 

 

 

'하.. > java' 카테고리의 다른 글

ch14 Optional<T>  (0) 2021.12.26
ch14 스트림의 중간연산2  (0) 2021.12.26
ch14 스트림의 연산  (0) 2021.12.26
ch14 스트림 만들기  (0) 2021.12.26
ch14 스트림 스트림의 특징  (0) 2021.12.26