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 의 차이점]
- groupBy : keySelector 를 받는다. (associateBy 와 비슷) 반면에, keySelector 에 해당하는 value 가 여러개면 모두 value 가 된다. (value 가 List)
- associateBy : keySelector 에 해당하는 value 가 여러개라면 마지막으로 해당하는 value 만을 value 로 넣는다. (value 가 List 가 아니라 객체 하나.)
https://proandroiddev.com/kotlin-collections-appended-to-by-and-with-205d9540208
https://play.kotlinlang.org/byExample/05_Collections/10_associateBy
'TIL' 카테고리의 다른 글
TIL) 인덱스, DFA (0) | 2022.02.23 |
---|---|
TIL) Webserver vs WAS, NGNIX vs Apache (0) | 2022.02.22 |
TIL) Enum, Memory Commit & OverCommit (0) | 2022.02.17 |
TIL) @Transactional Propagation, 스프링에서 초기화 코드를 넣기 (0) | 2022.02.17 |
TIL) TINYINT/BIT, Spring Content-type, 코드를 DB 에서 읽어와서 처리할 때 resource (0) | 2022.02.15 |