티스토리 뷰

java_basic

Lambda 기초4 중간연산2

✨✨✨✨✨✨✨ 2022. 2. 16. 12:17
반응형

자바의 정석 ch14-30~34 스트림의 중간연산(2)

  • map() : 변환
  • peek() -> 중간연산 | forEach() -> 최종연산
  • flatmap(); 스트림의스트림을 스트림으로 변환

스트림의 중간연산(5/7)

가. map()

해설 : 스트림의 요소변환해준다.

사용법:

// T 입력 R출력
Stram<R> map(Function<? super T,? extends R> mapper)

예제1: File의 이름을 뽑아오는 예제이다.

Stream이라는 파일객체를 map(File::getName)을 이용해서 Stream으로 변환해주었다.

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);
                                // fileStream.map((f)-> f.getName())
filenameStream.forEach(System.out::println); //스트림의 모든 파일의 이름을 출력

예제2: 확장자(대문자)를 중복없이 뽑아내기

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

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

fileStream.map(File::getName)
    .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() vs forEach()

  • peek()은 기능은 forEach()와 같지만 중간연산이기에 Stream을 소비하지않는다.
    그렇기에 Stream로 반환된다.
  • forEach()최종연산으로써 Stream을 소비한다. 하여 void로 반환된다.
Stream<T> peek(Consumer<? super T> action)    //중간연산 (스트림 소비X)
void forEach(Consumer<? super T> action)    //최종연산 (스트림 소비O)

예제1 peek()을 사용해서 중간중간 디버깅 용으로 사용한다.

File[] fileArray = { new File("Ex1.java"), new File("Ex1"),
                    new File("Ex1.bak2"), new File("Ex2.java"),
                    new File("Ex1.txt4")};

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

fileStream.map(File::getName)
    .filter(s->s.indexOf(".") != -1)        // 파일 확장자 없는것 제외
    .map(s->s.substring(s.indexOf(".")+1))    // Stream<String> -> Stream<String>
    .peek(s->System.out.printf("filename=>%s", s))
    .map(String::toUpperCase)                // Stream<String> -> Stream<String>
    .distinct()                                // 중복제거
    .forEach(System.out::println);            //JAVABAKTXT

스트림의 중간연산(7/7)

가. flatMap()

  • 스트림의 스트림을 스트림으로 변환할 때 사용한다. 말이 어려우니 예제로 고고

사용법: 배열스트림을 하나의 스트림으로 변환하는작업

Stream<String[]> strArrStream = Stream.of(new String[]{"a","b","c"},
                                         new String[]{"d","e","f"});

Stream<String> strStream = strArrStream.flatMap(Arrays::stream);
                        //strArrStream.flatMap(arr->Arrays.stream(arr));
                        //                             Arrays는 static이므로 메소드앞에 붙임

 

그림을 보면 아래와같이 Stream의 배열의 요소들을 모두 꺼내 하나의 스트림으로 변환하였다.

 

해당내용을 위에 배운 peek()함수를 이용해 찍어보면 아래와같다.

Stream<String[]> strArrStream = Stream.of(new String[]{"a","b","c"},
                                          new String[]{"d","e","f"});

strArrStream.peek(System.out::println)
    .flatMap(arr-> Arrays.stream(arr))
    //.flatMap(Arrays::stream)
    .forEach(System.out::println);

결과

[Ljava.lang.String;@515f550a
a
b
c
[Ljava.lang.String;@626b2d4a
d
e
f

 


출처 : https://youtu.be/sEa4RQGG0HU

자바의 정석 ch14-30~34 스트림의 중간연산(2)

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함