Language/Java

스트림의 중개 연산

원2 2022. 11. 7. 15:40
728x90
반응형

스트림 API에 의해 생성된 초기 스트림은 중개 연산을 통해 또 다른 스트림으로 변환

중개 연산은 스트림을 전달받아 스트림을 반환하므로, 중개 연산은 연속으로 연결해서 사용 가능

스트림의 중개 연산은 필터-맵(filter-map) 기반의 API를 사용함으로 지연(lazy) 연산을 통해 성능 최적화

 

대표적인 메소드

1. 스트림 필터링 : filter(), distinct()

2. 스트림 변환 : map(), flatMap()

3. 스트림 제한 : limit(), skip()

4. 스트림 정렬 : sorted()

5. 스트림 연산 결과 확인 : peek()

 

스트림 필터링

// 스트림 필터링
 IntStream st1 = IntStream.of(7,5,5,2,1,2,3,4,5,6);
 IntStream st2 = IntStream.of(7,5,5,2,1,2,3,4,5,6);
 IntStream st3 = IntStream.of(7,5,5,2,1,2,3,4,5,6);

 // 중복 제거
 st1.distinct().forEach(item -> System.out.print(item + " "));
 System.out.println();
 // 홀수만
 st2.filter(item -> item % 2 !=0).forEach(item -> System.out.print(item + " "));

결과

7 5 2 1 3 4 6 
7 5 5 1 3 5

스트림 변환

문자열로 이루어진 스트림을 map() 메소드를 이용하여 각 문자열의 길이로 이루어진 스트림으로 변환하는 예제

// 스트림 변환
Stream<String> st = Stream.of("HTML","CSS","JAVA","JAVASCRIPT");
st.map(s -> s.length()).forEach(System.out::println);

결과

4
3
4
10

 

여러 문자열이 저장된 배열을 각 문자열에 포함된 단어로 이루어진 스트림으로 변환

String[] arr = {"I study hard", "You study JAVA", "I am hungry"};

Stream<String> stream = Arrays.stream(arr);
stream.flatMap(s -> Stream.of(s.split(" +"))).forEach(System.out::println);

결과

 

I
study
hard
You
study
JAVA
I
am
hungry

스트림 제한

IntStream st1 = IntStream.range(0, 10);
IntStream st2 = IntStream.range(0, 10);
IntStream st3 = IntStream.range(0, 10);

// 첫번째 요소부터 전달된 개수만큼 요소를 제외
st1.skip(4).forEach(n -> System.out.print(n));
System.out.println();
// 첫번째 요소부터 전달된 개수만큼 요소 출력
st2.limit(5).forEach(n -> System.out.print(n));
System.out.println();
st3
        .skip(3)
        .limit(5)
        .forEach(n -> System.out.print(n + " "));

결과

456789
01234
3 4 5 6 7

스트림 정렬

sorted() 메소드는 해당 스트림을 주어진 비교자(comparator)를 이용하여 정렬

비교자를 전달하지 않으면 기본적으로 사전 편찬 순(natural order)으로 정렬

// 스트림 정렬
Stream<String> st1 = Stream.of("JAVA","HTML","JAVASCRIPT","CSS");
Stream<String> st2 = Stream.of("JAVA","HTML","JAVASCRIPT","CSS");

st1.sorted().forEach(s -> System.out.print(s + " "));
System.out.println();
st2.sorted(Comparator.reverseOrder()).forEach(s -> System.out.print(s + " "));

결과

CSS HTML JAVA JAVASCRIPT 
JAVASCRIPT JAVA HTML CSS

스트림 연산결과 확인

IntStream st = IntStream.of(7, 5, 5, 2, 1, 2, 3, 5, 4, 6);
st
        .skip(2)
        .peek(s -> System.out.println("skip(2) 실행 후-> " + s))
        .limit(5)
        .peek(s -> System.out.print("limit(5) 실행 후-> "))
        .forEach(n -> System.out.println(n));

결과

skip(2) 실행 후-> 5
limit(5) 실행 후-> 5
skip(2) 실행 후-> 2
limit(5) 실행 후-> 2
skip(2) 실행 후-> 1
limit(5) 실행 후-> 1
skip(2) 실행 후-> 2
limit(5) 실행 후-> 2
skip(2) 실행 후-> 3
limit(5) 실행 후-> 3
728x90
반응형