JAVA4_08_스트림의 중간 연산1
스트림의 연산
- 스트림이 제공하는 기능 : 중간 연산과 최종 연산
- 중간 연산 : 연산결과가 스트림인 연산. 반복적으로 적용 가능
- 최종 연산 : 연산결과가 스트림이 아닌 연산. 단 한번만 적용 가능(스트림의 요소를 소모)
중간 연산
-
filter()
: 걸러내기 -
peek()
:forEach()
랑 비슷, 작업 중간에 잘 처리됐나 확인하기 -
✨✨✨
map()
&flatMap()
스트림 자르기
skip()
Stream<T> skip(long n)
- 앞에서부터 n개 건너뛰기
limit()
Stream<T> limit(long maxSize)
- maxSize 이후의 요소는 잘라냄
예)
IntStream intStream = IntStream.rangeClosed(1, 10);
//1 2 3 4 5 6 7 8 9 10
intStream.skip(3).limit(5).forEach(System.out::print);
45678
스트림의 요소 걸러내기
filter()
`Stream filter(Predicate<? super T> predicate)
- 조건에 맞지 않는 요소 제거
- ✨✨조건식이 true인 요소만 남기기
distinct()
Stream<T> distict()
- 중복제거
예)
IntStream intStream = IntStream.rangeClosed(1, 10);
//1 2 3 4 5 6 7 8 9 10
intStream.filter(i->i%2==0).forEach(System.out::print);
intStream.filter(i->i%2!=0 && i%3!=0).forEach(System.out::print);
//***&& 일 경우 filter()를 나눠서 해도 된다!
intStream.filter(i->i%2!=0).filter(i->i%3!=0).forEach(System.out::print);
246810
157
157
예)
IntStream intStream = IntStream.of(1,2,2,6,3,4,5,5,3,6);
intStream.distinct().forEach(System.out::print);
126345
스트림 정렬하기
sorted()
Stream<T> sorted()
- 스트림 요소의 기본 정렬(Comparable)로 정렬
Stream<T> sorted(Comparator<? super T> comparator)
- 지정된 Comparator로 정렬
Comparator.comparing()
으로 정렬기준 제공
Comparator comparing(Function<T,U> keyExtractor)
Comparator comparing(Function<T,U> keyExtractor, Comparator<U> keyComparator)
- Function 함수형인페 사용
- comparing()이 Comparator를 반환하여 sorted()가 사용
예)
Student::getBan
==(Student s) -> s.getBan()
thenComparing()
- 정렬기준이 여러개 일 때
Comparator thenComparing(Comparator<T> other)
Comparator thenComparing(Function<T,U> keyExtractor)
Comparator thenComparing(Function<T,U> keyExtractor, Comparator<U> keyComp)
예)
studentStream.sorted(Comparator.comparing(Student::getBan) //반별로 정렬
.thenComparing(Student::getTotalScore) //총점별로 정렬
.thenComparing(Student::getName)) //이름별로 정렬
.forEach(System.out::println);
ex14_05
import java.util.Comparator;
import java.util.stream.Stream;
public class Ex14_05 {
public static void main(String[] args) {
Stream<Student> stuStream = 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)
);
// stuStream.sorted().forEach(System.out::println); //기본정렬:총점 내림차순
stuStream.sorted(Comparator.comparing(Student::getBan) //반별 정렬
.thenComparing(Comparator.naturalOrder())) //기본정렬(총점 내림차순)
// .thenComparing(Comparator.naturalOrder()).reversed()) //기본 반대정렬(총점 올림차순)
// .thenComparing(Comparator.reverseOrder())) //기본 반대정렬(총점 올림차순)
.forEach(System.out::println);
}//main
}
class Student implements Comparable<Student>{
String name;
int ban;
int totalScore;
public String getName() {return name;}
public int getBan() {return ban;}
public int getTotalScore() {return totalScore;}
Student(String name, int ban, int totalScore) {
this.name = name;
this.ban = ban;
this.totalScore = totalScore;
}
//****기본정렬을 총점 내림차순으로 한다.
//오버라이드 필수로 해야한다!!
@Override
public int compareTo(Student s) {
return s.totalScore - this.totalScore;
}
//***
public String toString() {
return String.format("[%s, %d, %d]", name, ban, totalScore);
}
}
stuStream.sorted().forEach(System.out::println); //기본정렬:총점 내림차순
[이자바, 3, 300]
[나자바, 3, 290]
[김자바, 1, 200]
[소자바, 1, 200]
[감자바, 3, 180]
[박자바, 2, 150]
[안자바, 2, 100]
stuStream.sorted(Comparator.comparing(Student::getBan)) //반별 정렬
.forEach(System.out::println);
[김자바, 1, 200]
[소자바, 1, 200]
[안자바, 2, 100]
[박자바, 2, 150]
[이자바, 3, 300]
[나자바, 3, 290]
[감자바, 3, 180]
stuStream.sorted(Comparator.comparing(Student::getBan) //반별 정렬
.thenComparing(Comparator.naturalOrder())) //기본정렬(총점 내림차순)
.forEach(System.out::println);
[김자바, 1, 200]
[소자바, 1, 200]
[박자바, 2, 150]
[안자바, 2, 100]
[이자바, 3, 300]
[나자바, 3, 290]
[감자바, 3, 180]
stuStream.sorted(Comparator.comparing(Student::getBan) //반별 정렬
.thenComparing(Comparator.reverseOrder())) //기본 반대정렬(총점 올림차순)
.forEach(System.out::println);
[김자바, 1, 200]
[소자바, 1, 200]
[안자바, 2, 100]
[박자바, 2, 150]
[감자바, 3, 180]
[나자바, 3, 290]
[이자바, 3, 300]
✨✨✨조심해야 할 것!! reversed()
stuStream.sorted(Comparator.comparing(Student::getBan) //반별 정렬
.thenComparing(Comparator.naturalOrder()).reversed()) //기본 반대정렬(총점 올림차순)
.forEach(System.out::println);
[감자바, 3, 180]
[나자바, 3, 290]
[이자바, 3, 300]
[안자바, 2, 100]
[박자바, 2, 150]
[김자바, 1, 200]
[소자바, 1, 200]
reversed()
: ✨✨앞의 모든 것에 적용
stuStream.sorted(Comparator.comparing(Student::getBan).reversed() //반별 정렬
.thenComparing(Comparator.naturalOrder())) //기본 반대정렬(총점 올림차순)
.forEach(System.out::println);
[이자바, 3, 300]
[나자바, 3, 290]
[감자바, 3, 180]
[박자바, 2, 150]
[안자바, 2, 100]
[김자바, 1, 200]
[소자바, 1, 200]
- 이번엔 맨 앞만 적용되었기에 뒤는 신경 안써도 된다.
.thenComparing(Comparator.naturalOrder()).reversed()) //기본 반대정렬(총점 올림차순)
.forEach(System.out::println);
[김자바, 1, 200]
[소자바, 1, 200]
[안자바, 2, 100]
[박자바, 2, 150]
[감자바, 3, 180]
[나자바, 3, 290]
[이자바, 3, 300]
-
앞에 한번, 그리고 전체적으로 다시 한번 적용!!
-
✨✨
reversed()
: 맨앞 또는 전체에 한번에 역순정렬 할 때!! -
💖💖💖
reverseOrder()
: 하나만 역순정렬 할 때!!
Ref
Author And Source
이 문제에 관하여(JAVA4_08_스트림의 중간 연산1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lecharl/JAVA408저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)