JAVA4_09_스트림의 중간 연산2
중간 연산
스트림의 요소 변환하기
map()
Stream<R> map(Function<? super T, ? extends R> mapper)
Stream<T>
를Stream<R>
로 바꾸기
예)
예)
ex14_06
import java.io.File;
import java.util.stream.Stream;
public class Ex14_06 {
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);
Stream<String> nameStream = fileStream.map(f->f.getName());
//***인스턴스메소드이므로 참조변수f 필요
//??????근데 매개변수로 아무것도 안받던데 ()비워둬야 하지 않나???
nameStream.forEach(System.out::println);
System.out.println();
//**fileStream 부터 스트림 다시 생성**, nameStream 안만들고 바로 아래처럼!
fileStream = Stream.of(fileArr);
fileStream.map(File::getName)
.filter(s -> s.indexOf('.')!=-1) //확장자 있는 것만
//***인스턴스substring(int인덱스) 인덱스~부터 해당하는 문자열 잘라내서 반환
//확장자만 추출
.map(s -> s.substring(s.indexOf('.')+1))
.map(String::toUpperCase)
.distinct() //.java가 두개인데 중복제거로 하나만!
.forEach(System.out::println);
}
}
Ex1.java
Ex1.bak
Ex2.java
Ex1
Ex1.txt
JAVA
BAK
TXT
스트림의 요소를 소비하지 않고 엿보기
peek()
Stream<T> peek(Consumer<? super T> action)
- 잘 되고 있는지 디버깅 용도로 중간작업결과 확인
- ✨스트림의 요소를 소비하지 않는다!!
ex14_06
import java.io.File;
import java.util.stream.Stream;
public class Ex14_06 {
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);
Stream<String> nameStream = fileStream.map(f->f.getName());
//***인스턴스메소드이므로 참조변수f 필요
//??????근데 매개변수로 아무것도 안받던데 ()비워둬야 하지 않나???
nameStream.forEach(System.out::println);
System.out.println();
//**fileStream 부터 스트림 다시 생성**, nameStream 안만들고 바로 아래처럼!
fileStream = Stream.of(fileArr);
fileStream.map(File::getName)
.filter(s -> s.indexOf('.')!=-1) //확장자 있는 것만
.peek(s->System.out.printf("filename= %s%n", s))
//***인스턴스substring(int인덱스) 인덱스~부터 해당하는 문자열 잘라내서 반환
//확장자만 추출
.map(s -> s.substring(s.indexOf('.')+1))
.peek(s->System.out.printf("extensoin= %s%n", s))
.map(String::toUpperCase)
.distinct() //.java가 두개인데 중복제거로 하나만!
.forEach(System.out::println);
}
}
Ex1.java
Ex1.bak
Ex2.java
Ex1
Ex1.txt
filename= Ex1.java
extensoin= java
JAVA
filename= Ex1.bak
extensoin= bak
BAK
filename= Ex2.java
extensoin= java
filename= Ex1.txt
extensoin= txt
TXT
스트림의 스트림을 스트림으로 변환
flatMap()
-
👀👀👀스트림의 요소 각각 스트림일 때, 그것들을 전체 하나의 스트림으로 합칠 때??
-
🎇스트림{스트림{요소a, 요소b, ...}, 스트림{요소A, 요소B, ...}, ...}
-> 🎆스트림{요소a, 요소b, 요소A, 요소B, ...}
이거 맞나????????????
map()
은 스트림의 스트림으로 됨.. 🎇<- 요거
ex14_07
- ✨✨✨여러 문장이 있을 때 단어들만 뽑아낼 때
import java.util.Arrays;
import java.util.stream.Stream;
public class Ex14_07 {
public static void main(String[] args) {
Stream<String[]> strArrStream = Stream.of(
new String[] {"abc","def","jkl"},
new String[] {"ABC","GHI","JKL"} );
//map
// Stream<Stream<String>> strStrmStream = strArrStream.map(Arrays::stream);
// strStrmStream
//// .map(String::toLowerCase)
//// .distinct()
//// .sorted() 요소가 Stream<String>이기 때문에 못할..걸??
// .forEach(System.out::println);
Stream<String> strStream = strArrStream.flatMap(Arrays::stream);
strStream.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(" +")))
//split()으로 쪼개서 스트림<string> lineStream의 요소로..
//***split(정규식), + : 하나 이상의 공백
.map(String::toLowerCase)
.distinct()
.sorted()
.forEach(System.out::println);
}
}
//java.util.stream.ReferencePipeline$Head@65b54208
//java.util.stream.ReferencePipeline$Head@1be6f5c3
abc
def
ghi
jkl
believe
do
is
it
no
not
or
there
true
try
Ref
Author And Source
이 문제에 관하여(JAVA4_09_스트림의 중간 연산2), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@lecharl/JAVA409저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)