JAVA - 람다와 스트림(10)

jodbsgh·2022년 5월 2일
0

💡"JAVA"

목록 보기
63/67

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

Stream<R> map (Function T, 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::print);	//스트림의 모든 파일의 이름을 출력

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

map() 예제

class Test {
	public static void main(String[] args)
    {
    	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();
        
    }
}

스트림의 요소를 소비하지 않고 엿보기 - peek()

Stream<T> peek(Consumer action)		//중간 연산(스트림을 소비x)
void forEach(Consumer 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);						//최종연산 스트림을 소비

peek()예제

class Test {
	public static void main(String[] args)
    {
    	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)	//확장자가 없는 것은 제외
        .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::print);		//JAVABAKTXT
        
        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> strStrStrm = strArrStrm.flatMap(Arrays::stream);	//Arrays.stream(T[])

flatMap() 예제

import java.util.*;
class Test{
	public static void main(String[] args)
    {
      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 = {
          "Belive 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);
      System.out.prontln();
	};
}
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글