cleanUrl: /posts/remove-stream-in-kotlin
share: true

java 를 쓰다가 kotlin 으로 넘어오다 보니 여러 곳에서 stream 을 사용하다가 최근에 이런 리뷰를 받았다. kotlin에선 더 간결한 collection 함수를 제공하기 때문에 굳이 stream 을 사용할 필요가 없다는 것이다

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6d878a37-08b4-4a27-9f3c-939699e40b94/replace_stream.png

코틀린을 자바같이 쓰면 앙대앙대

그래서 이 코드를 바꿧고 다시 리뷰를 받았는데

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/c09fb800-f922-4be8-9fa9-80b8b66f75c2/Screen_Shot_2021-08-11_at_5.24.45_PM.png

엉엉.... 마감은 다가오고

그래 이왕 이렇게 된김에 Stream 을 모두 한번 제거해보자 라는 생각이 들었다.

collection에 . 찍고 보면 뭐가 있을지 대충 보이잖아? 그래서 비교하며 간단히 메모해두려고 한다

<script async src="<https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js>"></script>
<ins class="adsbygoogle"
     style="display:block; width: 100%;"
     data-ad-format="fluid"
     data-ad-layout-key="-fb+5w+4e-db+86"
     data-ad-client="pub-8946038251809377"
     data-ad-slot="5490836264"></ins>
<script>
     (adsbygoogle = window.adsbygoogle || []).push({});
</script>

Kotlin 으로 Map (key, value) 만들기

val dormantById = dormantRepository.findAll().stream()
            .collect(Collectors.toMap(AccountDormant::id, Function.identity()))

이 코드는 다음과 같이 수정이 가능하다

val dormantById = dormantRepository.findAll().map { it.id to it }.toMap()

그런데 똑똑한 IntelliJ 는 여기에 추천 코드를 보여줬다

val dormantById = dormantRepository.findAll().associateBy { it.id }

3가지 모두 다 key-value 형태의 Map 을 만들어준다.

Kotlin 으로 Set (key) 만들기

val accountIds = items.stream().map {
    it.id
}.collect(Collectors.toSet())

이 코드 역시 쉽게 변환이 가능하다

val accountIds = items.map {
		it.id
}.toSet()