map, filter

김건우·2023년 12월 18일

개발 공부

목록 보기
6/13
post-thumbnail

map

  • map은 코틀린의 collection - List, Set, Map(Dictionary) 를 변형시키는 함수이다.
  • collection의 원소에 대해 함수(람다 식)를 실행한 결과를 새로운 List으로 반환한다.
  • collection 원소의 배열 순서는 변하지 않는다.
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
결과 : [3, 6, 9]

mapIndexed - 인덱스를 함수에 포함

  • collection인덱스를 함수에 적용시키려면, mapIndexed()를 사용할 수 있다.
val numbers = setOf(1, 2, 3)
println(numbers.mapIndexed { idx, value -> value * idx })
[0, 2, 6]

mapNotNull - null을 제외하고 반환

  • 함수 변환으로 인한 결과가 null을 반환할 가능성이 있다면, mapNotNull 을 사용할 수 있다.
val numbers = setOf(1, 2, 3)
println(numbers.mapNotNull { if ( it == 2) null else it * 3 })
println(numbers.mapIndexedNotNull { idx, value -> if (idx == 0) null else value * idx })
결과 : [3, 9]				// 2는 null이라서 제외되고 나머지 값을 변환하여 리스트로 반환
	  [2, 6]

mapKeys, mapValues - map의 key와 value에 대한 함수 변환

  • map 을 변환할 때 key 만 변환하거나 value 만 변환할 수 있다.
  • key 를 변환할 때는 mapKeys() 를 사용하고,
    value 를 변환할 때는 mapValues() 를 사용한다.
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
println(numbersMap.mapKeys { it.key.uppercase() })
println(numbersMap.mapValues { it.value + it.key.length })
결과 : {KEY1=1, KEY2=2, KEY3=3, KEY11=11}
	{key1=5, key2=6, key3=7, key11=16}

filter

  • filter 는 주어진 조건을 만족하는 원소들을 모아 새 리스트를 생성한다.
  • ListSetfilter 를 사용하면 List 를 반환하고,
    Map 에 대해선 Map 으로 반환된다.
val numbers = listOf("one", "two", "three", "four")  
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)
결과 : [three, four]
  • numbers 리스트 의 원소들 중에 길이가 3 초과인 원소들을 새로운 리스트로 반환한다.
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10}
println(filteredMap)
결과 : {key11=11}
  • numbersMap 의 원소들 중에 key 가 1로 끝나고, value 가 10 초과인 원소를 으로 반환한다.

filterIndexed(), filterNot() - 인덱스를 활용한 filter, 조건을 만족하지 않는 원소를 찾는 filter

  • filter() 는 원소들의 만을 체크하지만, 검사하고자 하는 컬렉션인덱스를 같이 검사하려면 filterIndexed() 를 사용할 수 있다.
  • 인덱스 두 가지 인자를 사용한다.
val numbers = listOf("one", "two", "three", "four")

val filteredIdx = numbers.filterIndexed { index, s -> (index != 0) && (s.length < 5)  }
val filteredNot = numbers.filterNot { it.length <= 3 }

println(filteredIdx)
println(filteredNot)
결과 :
[two, four]
[three, four]
  • filteredIdx 는 index와 s를 함께 인자로 사용해 numbers 리스트 의 원소들 중에 인덱스 가 0이 아니고, 의 길이가 5 미만인 원소들을 리스트로 반환한다.
  • filterNot() 은 조건에 만족하지 않는 원소들을 반환한다.
  • filteredNot 에서는 numbers 리스트 의 원소들 중에 길이가 3이하가 아닌(4 이상인) 원소들을 반환한다.

filterIsInstance() - 원하는 타입의 원소 찾기

  • filterIsInstance() 는 인자로 넣은 타입의 원소들을 반환한다.
  • List 타입에 filterIsInstance()를 사용하면 List 를 반환한다.
val numbers = listOf(null, 1, "two", 3.0, "four")
println("All String elements:")
println(numbers.filterIsInstance<String>())
결과 : 
All String elements:
[two, four]
  • 여러 타입으로 이루어진 numbers 리스트 에 대해 filterIsInstance<String>() 을 실행한 결과 리스트의 String 타입 원소인 "two", "four" 만 리스트로 반환된다.

filterNotNull() - Null이 아닌 원소 찾기

  • filterNotNull()null 이 아닌 원소들을 반환한다.
  • List<T?> 에 filterNotNull()을 사용하면 List<T: Any> 로 반환된다.
val numbers = listOf(null, "one", "two", null)
numbers.filterNotNull().forEach {
    println(it.length)  
}
결과:
3
3
  • null 이 아닌 원소인 "one", "two"를 반환하고, 해당 원소의 길이를 출력해 결과가 3, 3으로 반환된다.
profile
즐겁게

0개의 댓글