ch 14-26~29 스트림의 중간연산(1)
스트림의 중간연산(1/7)
- 스트림 자르기 - skip(), limit()
Stream<T> skip(long a) // 앞에서부터 n개 건너뛰기
Stream<T> limit(lon maxSize) // maxSize 이후의 요소는 잘라냄
IntStream intStream = InteStream.rangeClosed(1, 10); // 12345678910
intStream.skip(3).limit(5).forEach(System.out::print); // 45678
스트림의 중간연산(2/7)
- 스트림의 요소 걸러내기 - 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
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);
스트림의 중간연산(3/7)
Stream<T> sorted() // 스트림 요소의 기본 정렬(Comparable)로 정렬
Stream<T> sorted(Comparator<? super T> comparator) // 지정된 Comparator로 정렬
static Comparator<String> CASE_INSENSITIVE_ORDER
= new CaseInsenstiveComparator();
스트림의 중간연산(4/7)
- Comparator의 cmparing()으로 정렬 기준을 제공
comparing(Function<T, U> kdwyExtractor)
comparing(Function<T, U> kdwyExtractor, Comparator<U> keyComparator)
studentStream.sorted(Comparator.comparing(Studend::getBan) // 반별로 정렬
.forEach(System.out::println);
- sorted()는 매개변수로 Comparator를 필요로 한다.
- 추가 정렬 기준을 제공할 때는 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);
ch14-30~34 스트림의 중간연산(2)
스트림의 중간연산(5/7)
Stream<R> map(Function<? super T,? extends R> mapper) // Stream<T>->Stream<R>
Stream<File> fileStream = Stream.of(new File("Ex1.java"), new File("Ex1")
new File("Ex1.bak"), new File("Ex2.java"), new File("Ex1.txt"));
Stream<String> filenameStream = fileStream.map(File::getName);
filenameStream.forEach(System.out::println); // 스트림의 모든 파일의 이름을 출력
ex) 파일 스트림(Stream<File>)에서 파일 확장자(대문자)를 중복없이 뽑아내기
fileStream,.map(File::getName) // Stream<File> -> Stream<String>
.filter(s->s.indexof('.')!=-1) // 확장자가 없는 것은 제외
.map(s->s.substring(s.indexOf('.')+1)) // Stream<String>->Stream<String>
.map(String::toUpperCase) // Stream<String>->Stream<String>
.distinct() // 중복 제거
.forEach(System.out::print); // JAVABAKTXT
스트림의 중간연산(6/7)
- 스트림의 요소를 소비하지 않고 엿보기 - peek()
Stream<T> peek(Consumer<? super T> action) // 중간 연산(스트림을 소비X)
void forEach(Consumer<? super T> action) // 최종 연산(스트림을 소비O)
FileStream.map(File::getName) // Stream<File> -> Stream<String>
.filter(s -> s.indexOf('.')!=1) // 확장자가 없는 것은 제외
.peek(s->System.out.printf("filename=%s%n", s)) // 파일명을 출력한다.
.map(s -> s.substring(s.indexOf('.')+1)) // 확장자만 추출
.peek(s->System.out.printf("extension=%s%n", s)) // 확장자를 출력한다.
.forEach(System.out::println); // 최종연산 스트림을 소비
스트림의 중간연산(7/7)
- 스트림의 스트림을 스트림으로 변환 - flatMap()
Stream<String[]> strArrStrm = Stream.of(new String[] {"abc", "def", "ghi" },
new String[] {"ABC", "GHI, "JKLMN"});
Stream<Stream<String> strStrStrm = strArrStrm.map(Arrays::stream);
- flatMap을 통해 여러 개의 문자배열을 하나의 문자 배열인 것처럼 변환한다.