JAVA/JAVA | Spring 학습기록

[JAVA] 스트림 filter을 anyMatch, allMatch로 바꿔보자

kth990303 2021. 12. 11. 17:28
반응형

코드 indent(들여쓰기)를 최소화하기 위해서 filter를 사용하면서 github에 commit하려던 와중에 아래 메시지가 발생했다.

자바 List 컬렉션에서 Stream api를 통해 특정 조건을 만족하는 원소가 하나라도 있다면~ 의 작업을 해주기 위해

아래와 같이 코드를 짰었다.

상품의 가격이 10의 배수가 아닌 물건이 하나라도 존재한다면

일단 stream api를 통해 위와 같이 코드를 작성한 결과

for문 -> if문이 요구되는 indent 2로 원소를 뽑아내는 대신, indent 0으로 간단하게 해당 원소를 뽑아낼 수 있었다.

 

그런데 똑똑한 인텔리제이는 코드를 보며 아래와 같이 말한다.

 

인텔리제이: 어차피 count()로 개수 파악하려고 하는 것이 아닌, 존재하는지만 파악하려면 anyMatch 키워드를 써봐~

 

오... anyMatch?

위 코드를 아래와 같이 바꿨다.

좀 더 간단해진 모습

Stream().filter().count() > 0 으로 했었던 과거에 비해

Stream().anyMatch() 로 코드가 간단해진 것을 볼 수 있다.

또한, anyMatch() 자체는 타입형이 boolean이기 때문에 >0과 같이 조건문으로 처리할 필요가 없다는 점!


비슷한 예로 allMatch가 있다.

allMatch는 filter의 조건을 모든 원소가 만족할 경우 특정 로직을 실행하고 싶을 때 사용하면 된다.

List 컬렉션 내 모든 코인이 0개일 때 잔돈반환을 하지 않는다는 메시지를 보내준다.


Stream과 Filter, max, min에 더불어 anyMatch라는 기능도 알게 됐다.

java, js, python이 아무래도 좀 더 high level 언어이다보니 c/c++보다 유지보수/생산성 쪽으로 편리한 기능들이 많은 것 같다.

반응형