ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 람다와 스트림 - 최종 연산
    백엔드/자바 2023. 4. 17. 05:40

    스트림의 최종 연산이란?

     

    람다와 스트림 - 스트림의 정의와 특징

    스트림의 정의와 그 필요성 한마디로 말하면 컬렉션이나 배열을 다루기 쉽게 만든 것이다. 기존의 컬렉션 프레임웍을 보면 위와 같이 List, Set, Map의 인터페이스로 구성된 것을 알 수 있다. 이 중

    sgcomputer.tistory.com

     

    이전 파트에서 배웠듯이 스트림은 일반적인 객체와 달리 한번 사용하고 나면 재활용이 불가능하다고 배웠다.

     

    그때 이 사용의 기준이 되는 것이 바로 최종 연산이다.

     

     

     

    이전에 써먹었던 그림을 다시 가져오면 위와 스트림은 위와 같은 과정으로 사용하게 된다.

     

    컬렉션 데이터에 대한 스트림 요소를 생성한 뒤 중간 연산을 통해 데이터를 가공한다.

     

    그 뒤에 최종 연산 과정에서 스트림 요소를 소모하면서 스트림의 사용이 끝나게 되는 것이다.

     

    해당 파트에서는 스트림의 다양한 최종 연산 방법에 대해 공부해보도록 하겠다.

     

    최종 연산 - forEach() : 결과 출력

     

    forEach()는 많은 예시에서 이미 사용했는데 스트림의 데이터들을 출력하는 기능을 한다.

     

    forEach() 메서드는 반환 타입이 void이므로 아무것도 반환하지 않는다.

     

    그리고 인수로는 Consumer 인터페이스 형식의 람다식만 전달 받는다.

     

    최종 연산 - allMatch(), anyMatch(), noneMatch : 조건식 일치 여부

     

    이번 단락에서 소개할 메서드들은 조건에 따른 결과가 일치하는지 여부를 따지는 기능을 한다.

     

    - allMatch() : 전달된 인자가 전부 조건에 맞을 경우 true 반환.

    - anyMatch() : 전달된 인자 중 하나라도 조건에 맞을 경우 true 반환.

    - nonMatch() : 전달된 인자가 모두 조건에 안맞을 경우 true 반환.

     

    위의 그림과 메서드 설명만 봐도 사용이 어려운 메서드는 아니라는 걸 알 수 있다.

     

    세 개의 메서드 모두 boolean을 반환타입으로 갖고 있으며 인자로는 Predicate 인터페이스의 람다식을 받는다.

     

    최종 연산 - findFirst(), findAny() : 조건식 일치 여부

     

    - findFirst() : 조건 식에 맞는 요소들 중에서 가장 첫번째 요소 반환

    - findAny() : 조건 식에 맞는 요소들 중에서 아무 요소나 하나 반환

     

    findFirst()와 findAny()는 filter()와 같이 쓴다고 보면 편하다.

     

    filter()를 통해서 걸러진 요소들 중 findFirst()는 첫 번째 요소를 findAny() 랜덤한 요소를 하나 반환한다.

     

    이때 주의할 점은 findAny()는 parallelStream() 즉 병렬 스트림일 때만 제대로 작동한다.

     

    만약 일반 직렬 스트림일 경우 findFirst()처럼 조건에 맞는 요소 중 첫번째 요소를 반환한다.

     

    그리고 하나 더 중요한 점은 findFirst()와 findAny() 모두 반환타입이 Optional이라는 것이다.

     

    이는 조건에 맞는 식이 하나도 없는 경우를 NullPointException을 방지하기 위함이다.

     

     최종 연산 - reduce() : 스트림의 누적 연산을 수행

     

    reduce는 겉보기에는 복잡해 보이지만 실은 그렇게까지 어렵진 않다.

     

    reduce에 인수로 제공되는 수는 초기값, 스트림 요소의 연산 결과값, 스트림 요소 총 세가지다.

     

    연산 과정을 설명하자면 다음과 같다.

     

    - a의 초기값은 지정된 숫자 0에서 시작한다. 연산이 진행되면 a는 a+b의 값을 갖는다.

    - b는 연산이 진행됨에 따라 list의 요소들을 차례로 갖는다.

    - 즉 연산 과정에 따른 값의 변화는 다음과 같다.

     

    - 0+1 = 1

    - 1+2 = 3

    - 3+3 = 6

    - 6+4 = 10

    - 10+5 = 15

    표로 나타내면 위와 같다고 보면 된다.

     

    a는 처음 연산에만 초기값을 빌려 쓰고 그 다음 연산부터는 a는 연산의 결과인 a+b의 값을 사용한다.

     

    reduce는 이런식으로 모든 요소에 대한 누적 연산이 가능하고 이를 이용해 다양한 연산이 가능하다.

     

     

     

    위의 그림을 통해 reduce()의 인수로 어떤 초기값과 식을 주느냐에 따라 결과는 다르게 나오는 것을 확인할 수 있다.

     

Designed by Tistory.