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
반응형