JAVA4_09_스트림의 중간 연산2

27743 단어 JavaJava

중간 연산



스트림의 요소 변환하기

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

좋은 웹페이지 즐겨찾기