스트림의 요소 변환하기 - 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();
};
}