Programming Language/Java

[Java] Stream 간단 활용

Sergemeow 2022. 10. 4. 22:45

Stream. 자료의 대상과 관계없이 동일한 연산을 수행할 수 있도록 해주는 반복자

라고 배웠는데 곧바로 머리에 들어오지는 않고, 사용하다보니 깨닫게된 정의는;

컬렉션에 저장되어있는 요소들을 하나씩 람다식으로 처리할 수 있도록 해주는 반복자

가 아닐까 싶다. 내 얕은 활용경험으로 도출된 것이니 이보다 더 포괄적인 개념일수도 있어서 구글링 해보니 대략 내 생각이 맞는 것 같다.

Stream은 한번 생성하면 재사용이 불가능하다. 다시 말하자면, 스트림을 사용하여 연산을 수행하면 스트림이 소모된다는 것. 또한 기존 자료를 변경하지 않기에 일회성으로 자료를 가져다가 처리해 사용하고 휘발되게 하는 식의 쓰임에 유용하다. 

Stream 코드로 사용되는 연산자에 대한 세세한 설명보단, 우선 쓰임을 먼저 보자.

위는 1~5까지 정수를 요소로 가지는 배열에서, 각 요소들의 총합, 요소들의 개수, 요소들의 평균을 stream을 써서 구하고 출력하는 코드들이다.

특이한 점은 평균값인 avg가 double로는 정의되지 않고 OptionalDouble로만 가능한데, optional 클래스에 대해서는 추가적인 공부와 이해가 필요하기에 차후 별도 포스팅으로 다루려 한다. avg가 OptionalDouble 형태이지만 출력은 double 형태로 해주기 위해 출력문 안에서는 .getAsDouble()을 붙여주었다.

 

sum, count, average 너무 쉽지. 이번엔 간단한 기믹을 넣어봤다.

Stream을 사용한 연산에서는 중간연산과 최종연산이 가능한 연산자들이 각각 별개로 존재한다. 

위의 예시에서 사용한 filter(조건에 맞는 요소 추출), map(키에 대한 값을 반환), distinct(중복값 삭제), sorted(오름차순 정렬) 등이 중간연산자이고 최종연산은 forEach, sum, toArray 등이 있다. Control+Space를 눌러가며 이클립스의 가이드를 받으면 손에 익지 않아도 구성하기 쉽다 

29번 라인은, arr1이라는 배열에 스트림을 사용할 건데 - Arrays.stream(arr1) - 배열 안의 값들을 하나씩 a라고 치고 반복하여 70보다 크거나 같은 값들만 - filter(a->a>=70) - 더한 것을 - sum() - int sum3으로 정의하자.

라는 뜻이다.

31번 라인도 비슷하게, 70보다 크거나 같은 값들만 모아다가 arr2의 배열을 만든다는 뜻이 되겠다.