본문 바로가기

프로그래밍/Java

Java8 변경사항 - 스트림API 중간연산

스트림의 중간연산

스트림 API에의해 생성된 스트림은 아래의 중간연산을 통해 다른 스트림으로 변환됩니다.

  1. 스트림 필터링
  2. 스트림 변환
  3. 스트림 제한
  4. 스트림 정렬
  5. 스트림 연산 결과 확인

1. 스트림 필터링

스트림에서 중복된 요소를 제거하거나 조건에 맞지 않는 요소를 걸러낸다.
filter(): 매개변수로 predicate가 필요한데 조건에 맞는 요소들로 새로운 스트림을 반환하며 필요에 따라 여러번 사용 가능하다.

IntStream stream = IntStream.range(1,11);   //1 ~ 10
stream.filter(i -> i % 2 == 0).forEach(System.out::println); // 2 4 6 8 10 짝수 출력

distinct(): 스트림에서 중복된 요소 제거

IntStream stream = IntStream.of(1, 2, 2, 2, 3, 3, 4, 4, 4, 4, 5);
stream.distinct().forEach(System.out::print);   //1 2 3 4 5

2. 스트림 변환

map(): 스트림의 요소 중에서 원하는 필드만 뽑아내어 새로운 스트림을 반환한다.
flatMap(): 스트림의 요소가 배열일때 각배열의 요소값의 반환값으로 새로운 스트림을 반환한다.

//map()
Stream<String> stream = Stream.of("Java", "cpp", "python", "php");
stream.map(s -> s.length)).forEach(System.out.::println); // 4 3 6 3

//flatMap()
Stream<String> stream = 
        Arrays.stream(new String[]{"Hello"," My name is Yang"});
stream.flatMap(s -> Stream.of(s.split(" +"))).forEach(System.out::println);

//실행결과
/*
Hello
My
name
is
yang
*/

3. 스트림 제한

limit(): 스트림의 첫 요소부터 파라미터의 개수만큼으로 이루어진 스트림 반환
skip(): 스트림의 첫 요소부터 파라미터의 개수를 건나 뛰고 나머지로 이루어진 스트림 반환

//
IntStream stream = IntStream.rangeClosed(1, 10);
stream.skip(2).limit(5).forEach(System.out::print); //34567

4. 스트림 정렬

스트림을 정렬할 때 sorted()메서드를 사용한다. 해당 스트림을 주어진 Comparator로 스트림을 정렬한다.
Comparator를 지정하지 않으면 기본 정렬 기준으로 정렬한다.

//
Stream<String> stream = Stream.of("Java", "cpp", "python", "php");
stream.sorted().forEach(System.out::println); 
/* 실행결과
Java
cpp
php
python
*/
Stream<String> stream2 = Stream.of("Java", "cpp", "python", "php");
stream2.sorted(Comparator.reverseOrder()).forEach(s -> System.out.print(s + " "));      //python php cpp Java

5. 스트림 연산 결과 확인

peek(): 스트림에서 연산 사이에 결과를 확인하고싶을때 하용

IntStream stream = IntStream.of(4, 5, 3, 2, 2, 1, 7, 5, 9, 6);
        stream.peek(s -> System.out.println("원본 스트림 : " + s))
                .skip(5)
                .peek(s -> System.out.println("skip(5) 실행 후 : " + s))
                .sorted()
                .peek(s -> System.out.println("sorted() 실행 후 : " + s))
                .forEach(n -> System.out.println(n));

/* 실행결과
원본 스트림 : 4
원본 스트림 : 5
원본 스트림 : 3
원본 스트림 : 2
원본 스트림 : 7
원본 스트림 : 5
skip(5) 실행 후 : 5
원본 스트림 : 9
skip(5) 실행 후 : 9
원본 스트림 : 6
skip(5) 실행 후 : 6
sorted() 실행 후 : 5
5
sorted() 실행 후 : 6
6
sorted() 실행 후 : 9
9
*/

'프로그래밍 > Java' 카테고리의 다른 글

java8 - time  (0) 2020.03.10
java8 - Optional  (0) 2020.02.23
java8 변경사항 - 스트림API 최종연산  (0) 2020.02.07
Java8 변경사항 - 스트림API 특징과 생성  (0) 2020.02.01
Java8 변경사항 - 람다 표현식  (0) 2020.01.29