티스토리 뷰
반응형
자바의 정석 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)
반응형
'java_basic' 카테고리의 다른 글
파일다운로드 (0) | 2022.11.17 |
---|---|
Lambda 기초5 최종연산 reduce (0) | 2022.02.16 |
Lambda 기초4 중간연산1 (2) | 2022.02.14 |
Lambda 기초3 (스트림 중간연산/최종연산 전체 메소드) (0) | 2022.02.01 |
Lambda 기초2 (스트림 생성하기) (0) | 2022.02.01 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- install
- 람다
- 차이
- MAC
- mvn
- BeanFactory
- 자바8
- 스트림
- Intellij
- webpack
- AnnotationConfigApplicationContext
- elasticsearch
- java
- ApplicationContext
- JPA
- 최종연산
- 중간연산
- nginx
- map
- docker
- springboot
- 영속성 컨텍스트
- NPM
- ngnix
- container
- lambda
- Vuex
- stream
- vscode
- Vue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함