CH14-30~34 스트림의 중간연산(2)

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

지난 시간 skip, limit, distinct, filter, sorted를 배웠다.

이번시간에는 map, peek, flatmap을 배워보자. peek은 forEach와 비슷한데, forEach는 최종연산이고, peek은 중간연산이다.

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

map()은 스트림의 요소를 바꾼다. 스트림 요소의 타입을 바꿀수도 있고, 같은 타입 내에서도 메서드를 참조해 다른 요소로 변환시킬수도 있다. 그래서 매핑의 의미로 map이라는 의미를 갖고 있다.

Untitled

Untitled

예제를 보자.

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")};
	};

위와 같이 File배열을 선언하고 멤버를 초기화했다.

Stream<File> fileStream = Stream.of(fileArr);
	
	// map()으로 Stream<File>을 Stream<String>으로 변환
	Stream<String> fileNameStream = fileStream.map(File::getName);
	fileNameStream.forEach(System.out::println);

파일타입을 갖는 스트림을 만든 후, 해당 스트림을 String타입의 스트림으로 매핑했다. 이는 File클래스의 getName()이라는, String을 반환하는 메서드를 통해 이뤄진다.

더 복잡한 작업을 해보자.

fileStream = Stream.of(fileArr); //다시 파일스트림 생성
	
	fileStream.map(File::getName).filter(s->s.indexOf('.')!= -1) //확장자 없는 것 제외
			.map(s->s.substring(s.indexOf('.')+1)) // 확장자만 추출
			.map(String::toUpperCase) //모두 대문자로 변환
			.distinct() //중복 제거
			.forEach(System.out::print); //출

Untitled