본문 바로가기

TIL

TIL) associate 시리즈

1. associate 시리즈

 

설명을 위한 클래스.

class Person(
	val name: String,
    val age: Int
)

val people = listOf(Person("a", 1), Person("b", 2), Person("c", 3))

 

  • associate { } : 인자로 () -> Pair() 를 받는다.
    • list.associate { Pair(it.name, it) }
  • associateTo { } : 인자로 결과가 저장될 Map 과 () -> Pair() 를 받는다.
    • val result = destinationMap.putAll(
      	people.associate { Pair(it.name, it) } )
          
      위와 아래는 같다.
          
      val result = people.associateTo { destinationMap, Pair(it.name, it) }
  • associateBy { } : 인자로 keySelector 하나를 받거나, keySelector 와 valueTransformer 두개를 받는 함수가 오버로딩으로 두개가 있다.
    • // keySelector 하나 받는 associateBy
      people.associateBy { it.name } // Map<name, person> 맵이 만들어진다.
      
      people.associate { Pair(it.name, it) } // 위와 같은 식.
      
      
      // keySelector, valueTransformer 둘 다 받는 associateBy
      fun getKey(person: Person): String = person.name // keySelector
      fun getValue(person: Person): Int = person.age // valueTransformer
      
      people.associateBy(::getKey, ::getValue) // Map<name, age> 맵이 만들어진다.
      
      people.associate { Pair(getKey(it), getValue(it)) } // 위와 같다.
  • associateWith { } : 이건 valueTransformer 만 받는다. key 는 항상 iterator 타입이다.
    • people.associateWith { getValue(it) } // Map<Person, Int> 맵이 만들어짐
      people.associateWith(::getValue) // 참조를 사용한 방법
      
      people.associate { Pair(it, ::getValue) } // 위와 같다.

 

그리고, associateBy, associateWith 에도 목적지를 인자로 받는 associateByTo, associateWithTo 가 있다.

 

 

 

[참고 : groupBy 와 associateBy 의 차이점]

  1. groupBy : keySelector 를 받는다. (associateBy 와 비슷) 반면에, keySelector 에 해당하는 value 가 여러개면 모두 value 가 된다. (value 가 List)
  2. associateBy : keySelector 에 해당하는 value 가 여러개라면 마지막으로 해당하는 value 만을 value 로 넣는다. (value 가 List 가 아니라 객체 하나.)

https://proandroiddev.com/kotlin-collections-appended-to-by-and-with-205d9540208

 

Kotlin Collection’s appended To, By, and With

Understand of Collection function variants by the name

proandroiddev.com

 

 

https://play.kotlinlang.org/byExample/05_Collections/10_associateBy

 

Kotlin Playground: Edit, Run, Share Kotlin Code Online

 

play.kotlinlang.org