ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바의 Stream이란?
    Language/JAVA 2022. 11. 29. 14:13
    728x90

    스트림(Stream)이란

     

    • 자바 8 에서 추가된, 람다를 활용하는 기술이다.
    • 람다식이란, 함수형 인터페이스의 구현 객체를 간결하게 표현하는 표현식이다.

     

    List<String> list = List.of("귀여운", "고양이");
    
    // arr를 오름차순으로 정렬
    Collections.sort(arr, (s1,s2) -> s2.compareTo(s1))
    • 자바 8 이전에는 컬렉션을 다룰 때 for문을 통해 다뤄야했기 때문에 로직이 복잡해 질 수록 여러 로직이 섞이면서 가독성이 떨어지는 문제가 있었는데, 이러한 문제들을 해결할 수 있게 되었다.
    • 스트림은 다음과 같은 특징이 있다.
      • 데이터 소스를 추상화하여 데이터를 다루는 방법들을 공통화하였다.
        • List의 정렬은 Collections.sort()를 사용하고,  Array를 정렬 할 때에는 Arrays.sort()를 사용해야 하는데 이들을 추상화하여 Stream.sort()를 사용한다.
      • 데이터를 담고 있는 저장소, 즉 컬렉션이 아니다.
      • 원본 데이터 소스를 변경하지 않는다.
      • Iterator처럼 일회용이다. 즉, 매번 다시 생성해야 한다.
      • 최종 연산을 수행하기 전까지 중간 연산은 수행되지 않으며(Lazy evaluation), 무제한으로 생성이 가능하다.
      • 병렬처리가 가능하다.

     

    스트림 사용 방법

     

     

    스트림 생성

     

    • Collection으로부터 스트림을 생성
    Stream<Integer> intStream = Arrays.asList(1,2,3).stream();
    Stream<String> strStream = Arrays.asList("귀여운", "고양이").stream();

     

     

    스트림 중간연산(intermediate operations)

     

    • 스트림의 중간연산은 연산 결과를 스트림으로 반환하기 때문에, 중간연산을 무한으로 사용할 수 있다.
    .distinct() // 중복 제거
    .filter(Predicate<T> predicate) // 조건에 맞지 않는 요소를 제외
    .limit(long maxSize) // maxSize 이후 요소는 없앤다.
    sorted() // 기본 오름차순 정렬
    sorted(Comparator<T> comparator) // 조건에 맞게 요소를 정렬
    
    //스트림의 요소를 반환한다. ex) map(File::getName), map(s->s.subString(3)) 등
    .map(Function<T,R> mapper)

     

     

    스트림 최종연산(terminal operations)

     

     

    • 스트림의 최종연산은 스트림의 요소를 소모하기 때문에 단 한 번만 사용이 가능하다.

     

    void forEach(Consumer<? super T> action) // 각 요소에 대해 작업 수행
    long count() // 스트림 요소 갯수 반환
    
    Optional<T> max(Comparator<? super T> comparator) // 최댓값 반환
    Optional<T> max(Comparator<? super T> comparator) // 최솟값 반환
    
    Optional<T> findAny() // 아무거나 한 개를 반환
    Optional<T> findFirst() // 가장 처음 스트림 요소를 반환
    
    Object[] toArray() // 스트림의 모든 요소를 배열로 반환

     

    • 또한 최종 연산 중에서도 가장 유용하게 쓰일 수 있는 것이 collect()이다.

     

    Stream<String> stuStream = new String[]{new Student("권혁준"), new Student("변성준"));
    
    // Student 인스턴스의 이름을 받아 List에 저장
    List<String> names = stuStream.map(Student::getName).collect(Collectors.toList());
    
    // Student 인스턴스의 이름을 받아 ArrayList에 저장
    ArrayList<String> list = stuStream.map(Student::getName)
    					.collect(Collectors.toCollection(ArrayList::new));

     

     

     

     

    참고

    자바의 정석 - 남궁성

    'Language > JAVA' 카테고리의 다른 글

    자바의 직렬화(Serialization)란?  (0) 2022.11.29

    댓글

Designed by Tistory.