1. 스트림의 중간연산
- 스트림의 요소 변환하기 - 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); // 스트림의 모든 파일의 이름을 출력
- 파일 스트림(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
- 예제
File[] fileArr = {new File("Ex.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();
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("filename=%s%n", s)) // 확장자를 출력한다.
.forEach(System.out::println); // 최종연산
File[] fileArr = {new File("Ex.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) // 확장자가 없는 것은 제외
.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))
.map(String::toUpperCase) // 모두 대문자로 변환
.distinct() // 중복제거
.forEach(System.out::println);
- 스트림의 스트림을 스트림으로 변환 - flatMap()
Stream<String[]> strARrStrm = Stream.of(new String[]{"abc", "def", "ghi" },
new String[]{"ABC", "GHI", "JKLMN"});
Stream<Stream<String> strStrStrm = strArrStrm.map(Arrays::stream);
// Stream<String[]> = Stream.of(new String[]{"aaa","bbb"},
// new String[]{"abc","ABC"}, new String[]{"ccc", "ddd"});
// Stream<String>("aaa", "bbb"), Stream<String>(abc","ABC"), Stream<String>("ccc","ddd")
Stream<String> strStrStrm = strArrStrm.flatMap(Arrays::stream); // Arrays.stream(T[])
// Stream<String>("aaa","bbb","abc","ABC","ccc","ddd"...)
Stream<String[]> strArrStrm = Stream.of(
new String[]{"abc","def","jkl"},
new String[]{"ABC","GHI","JKL"}
);
Stream<String> strStrm = strArrStrm.flatMap(Arrays::stream);
strStrm.map(String::toLowerCase)
.distinct()
.sorted()
.forEach(System.out::println);
System.out.println();
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(" +")))
.map(String::toLowerCase)
.distinct()
.sorted()
.forEach(System.out::println);
'Java' 카테고리의 다른 글
147. 스트림의 최종연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.12 |
---|---|
146. Optional<T> - 패스트캠퍼스 백엔드 부트캠프 3기 (2) | 2025.01.12 |
144. 스트림의 중간연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |
143. 스트림의 연산 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |
142. 스트림만들기 - 패스트캠퍼스 백엔드 부트캠프 3기 (0) | 2025.01.10 |