본문 바로가기

하../java

ch14 스트림의 중간연산2

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); - 스트림의 모든 파일의 이름을 출력

 

File[] fileArr = { new File("Ex1.java"), new File("Ex1.bak"),
			new File("Ex2.java"), new File("Ex1"), new File("Ex1.txt")
		};

		Stream<File> fileStream = Stream.of(fileArr);

		// map()으로 Stream<File>을 Stream<String>으로 변환
		Stream<String> filenameStream = fileStream.map(File::getName);
		filenameStream.forEach(System.out::println); // 모든 파일의 이름을 출력

		fileStream = Stream.of(fileArr);  // 스트림을 다시 생성

		fileStream.map(File::getName)     // Stream<File> → Stream<String>
			  .filter(s -> s.indexOf('.')!=-1)   // 확장자가 없는 것은 제외
			  .map(s -> s.substring(s.indexOf('.')+1)) // 확장자만 추출
			  .map(String::toUpperCase)     // 모두 대문자로 변환
			  .distinct()                   //  중복 제거
			  .forEach(System.out::print);  // JAVABAKTXT	

		System.out.println();
	}
}
출력값
Ex1.java
Ex1.bak
Ex2.java
Ex1
Ex1.txt
JAVABAKTXT

peek() - 스트림의 요소를 소비하지 않고 엿보기 중간 중간 디버깅 용도로 사용

Stream<T> peek (Consumer<? super T> action) - 중간 연산이여서 스트림을 소비하지 않음
void forEach(Consumer<? super T> action) - 최종 연산이여서 스트림을 소비
			  .peek(s->System.out.printf("filename=%s%n", s))
			  .peek(s->System.out.printf("extension=%s%n", s))
출력값
filename=Ex1.java
extension=java
JAVAfilename=Ex1.bak
extension=bak
BAKfilename=Ex2.java
extension=java
filename=Ex1.txt
extension=txt

flatMap() - 스트림의 스트림을 스트림으로 변환

Stream<String[]> strArrStrm = Stream.of(
			new String[]{"abc", "def", "jkl"},
			new String[]{"ABC", "GHI", "JKL"}
		);

//		Stream<Stream<String>> strStrmStrm = strArrStrm.map(Arrays::stream);
		Stream<String> strStrm = strArrStrm.flatMap(Arrays::stream);

		strStrm.map(String::toLowerCase) //스트림의 요소를 모두 소문자로 변경
			   .distinct() //중복제거
			   .sorted() //정렬
			   .forEach(System.out::println);
		System.out.println();
결과값
abc
def
ghi
jkl
String[] lineArr = {
			"Believe or not It is true",
			"Do or do not There is no try",
		};

		Stream<String> lineStream = Arrays.stream(lineArr);
		lineStream.flatMap(line -> Stream.of(line.split(" +"))) 
        //split은 String배열이 나오는데 공백 제거를함 +는 하나 이상의 공백 제거.
			.map(String::toLowerCase)
			.distinct()
			.sorted()
			.forEach(System.out::println);
		System.out.println();
결과값
believe
do
is
it
no
not
or
there
true
try

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

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