ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바/Java] 자바 스트림 (Stream) 알아보기
    Java 2021. 6. 18. 11:27

    스트림(Stream)이란

    : 자바 8부터 추가된 컬렉션의 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자

     

     

    스트림의 특징

    • 람다식으로 요소 처리가 가능하다.
    • 내부 반복자를 사용하므로 병렬 처리가 쉽다.
    • 요소의 중간 처리와 최종 처리를 할 수 있다.

     

     

    사용 예

    List<String> list = Arrays.asList("hong", "gom", "bong");
    list.stream()
        .forEach(name -> System.out.println(name) );

    stream() 메서드로 스트림 객체를 얻고 forEach() 안에 매개값 람다식을 통해 요소를 하나씩 콘솔에 출력한다.

    이게 가능한 이유는 forEach() 메서드는 Consumer 함수적 인터페이스 타입의 매개값을 가지기 때문이다.

     

     

    flatMapXXX() 메서드

    : flatMapXXX() 메서드는 해당 스트림의 요소를 대체하는 복수 개의 요소들로 구성된 새로운 스트림을 리턴한다.

    ex)

    List<String> list = Arrays.asList("hong gom", "gom bong");
    list.stream()
        .flatMap(data -> Arrays.stream(data.split(" ")))
        .forEach(word -> System.out.println(word));
        
    /*
    결과 : 
    hong
    gom
    gom
    bong
    */

    위 코드를 보면 flatMap() 메서드로 리스트의 각 요소를 split해서 새로운 스트림을 리턴 후 그 스트림을 forEach() 메서드를 통해 출력해줬다.

     

     

    mapXXX() 메서드

    : mapXXX() 메서드는 요소를 대체하는 요소로 구성되 새로운 스트림을 리턴한다.

    ex)

    List<Product> list = Arrays.asList(
        new Product("사과", 3000),
        new Product("붕어빵", 1000),
        new Product("바나나", 2000)
    );
    
    list.stream()
        .mapToInt(Product :: getPrice)
        .forEach(price -> System.out.println(price));
        
    /*
    결과 : 
    3000
    1000
    2000
    */

    위 코드를 보면 mapToInt() 메서드를 통해 각 요소의 가격을 long 에서 int로 타입으로 변환후 스트림을 리턴해줬고 그 요소를 출력해줬다. ('::' 더블 콜론에 의미를 모르겠으면 자바 메서드 참조 표현식을 검색해보길 바란다.)

     

     

    마치며

    이외에도 스트림은 정말 다양한 메서드를 지원한다.

    사용할 필요가 생길 때마다 검색해서 찾아보는 것이 좋을 것 같다. 

     

     

    참고자료

    • 신용권, 「이것이 자바다」, 한빛미디어 (2015)

    댓글