스트림의 중개 연산
스트림 생성으로 만든 스트림은 중개연산을 통해 다른 스트림으로 변환된다
중개연산은 스트림을 받아 스트림을 반환하기에 연속으로 사용할 수 있다.
중개연산은 filter-map 기반의 API를 사용함으로 지연연산을 통해 성능을 최적화 할 수 있다.
1. 스트림 필터링
filter() : 해당 조건에 맞는 새로운 스트림 반환
distinct() : 중복된 요소가 제거된 새로운 스트림 반환
IntStream iStream_1 = IntStream.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5);
IntStream iStream_2 = IntStream.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5);
iStream_1.filter(n -> n%2 == 0).forEach(System.out::println);
iStream_2.distinct().forEach(System.out::println);
2. 스트림 변환
map() : 스트림의 요소들을 주어진 함수에 전달해 함수의 결과값으로 이루어진 새로운 스트림을 반환
flatMap() : 해당 스트림의 요소가 배열일 경우 각 배열의 요소를 하나로 합친 새로운 스트림을 반환
Stream<String> stream_1 = Stream.of("Time", "to", "lazy");
Stream<String> stream_2 = Arrays.stream(new String[]{"Time", "to", "lazy"});
stream_1.map(s -> s).forEach(System.out::println);
stream_2.flatMap(s->Stream.of(s)).forEach(System.out::println);
3. 스트림 제한
limit() : 스트림의 처음부터 매개변수로 입력된 개수만큼으로 이루어진 새로운 스트림 반환
skip(): 스트림의 처음부터 매개변수로 입력된 개수만큼을 제외한 새로운 스트림을 반환
IntStream iStream_1 = IntStream.rangeClosed(1, 20);
IntStream iStream_2 = IntStream.rangeClosed(1, 20);
iStream_1.limit(10).forEach(e -> System.out.print(e+" "));
iStream_2.skip(10).forEach(e -> System.out.print(e+" "));
4. 스트림 정렬
sorted(): 해당 스트림을 매개변수로 전달된 Comparator를 사용해 정렬한다
전달된 Comparator가 없다면 사전순으로 정렬한다
new Random().ints().limit(5).sorted().forEach(System.out::println);
new Random().ints().limit(5).boxed().sorted(Comparator.reverseOrder()).forEach(System.out::println);
5. 스트림 연산 결과 확인
peek(): 결과 스트림으로부터 요소를 소모하여 추가로 명시된 동작을 수행
해당 메소드는 원본 스트림요소를 소모하지 않으므로 주로 연산 도중 결과를 확인하는 용도로 사용. (디버깅)
iStream.peek(s -> System.out.println("원본 스트림 : "+s))
.skip(2)
.peek(s -> System.out.println("스킵 실행후 : "+s))
.forEach(n -> System.out.println(n));
출처 : tcpschool.com/