Day 69

ChangWoo·2023년 6월 13일
0

자바의 정석

목록 보기
69/71
post-thumbnail

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)

  • 스트림 정렬하기 - sorted()
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)

  • 스트림의 요소 변환하기 - map()
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을 통해 여러 개의 문자배열을 하나의 문자 배열인 것처럼 변환한다.
profile
한 걸음 한 걸음 나아가는 개발자

0개의 댓글