14-30~34 스트림의 중간연산(2)

oyeon·2021년 3월 22일
0

Java 개념

목록 보기
68/70

스트림의 요소 변환하기 - map()

// Stream<T> -> Stream<R>
Stream<R> map(Function<? super T, ? extends R>mapper)
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

실습

public static void main(String[] args){
	String[] strArr = {
    	"Inheritance", "Java", "Lambda", "stream",
        "OptionalDouble", "IntStream", "count", "sum"
    };
    
    // Stream<String>을 Stream<Integer>로 변환
    // String::length == (s) -> s.length()
    Stream<Integer> intStream1 = Stream.of(strArr).map(String::length);
    
    // Stream<String>을 IntStream으로 변환. IntStream은 기본형 스트림.
    IntStream intStream2 = Stream.of(strArr).mapToInt(String::length);
}

중간 작업 결과 확인(디버깅 용도) - peek()

Stream<T> peek(Consumer<? super T> action) // 중간 연산(스트림을 소비 X)
void forEach(Comsumer<? 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)) // Stream<String> -> Stream<String>
 .peek(s -> System.out.printf("extension=%s%n", s)) // 확장자 출력
 .map(String::toUpperCase)	     // Stream<String> -> Stream<String>
 .distinct() // 중복제거
 .forEach(System.out::print); // JAVABAKTXT

스트림의 스트림을 스트림으로 변환 - 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으로 만든 결과를 원할 때가 많다.

// Arrays.stream(T[])
Stream<String> strStrStrm = strArrStrm.flatMap(Arrays::stream);

profile
Enjoy to study

0개의 댓글