Languages

kotlin의 collection 관련 함수 (filter, map, groupby ,flatMap, 술어함수)

!쪼렙조햄 2020. 4. 26. 21:32
반응형

kotlin 에서의 collection 함수 API

  • 여기에 등장하는 함수중에 코틀린에서 새로 만들어진 함수는 없다

👺 filter 와 map

val list = listOf(1,2,3,4)

println(list.filter{it %2 == 0})
println(list.map{it*it})
  • filter 함수
    • collection을 iteration하면서 주어진 lambda 에 각 원소를 넘겨서 true를 반환하는 원소만 모은다
    • 예제 : 짝수만 출력하게 됨
    • filter 함수는 collection에서 원소를 제거한다
    • 원소를 return 하지는 않는다
  • map 함수
    • 원소를 return 해준다
    • 예제 : 각 원소의 제곱값을 가진 collection을 반환한다
    • return값과 원본의 원소 개수는 같다
val people = listOf(Person("Alice", 29), Person("Bob", 31))
println(people.map{it.name})
println(people.map(Person::name))
  • 예제 : Person의 name 속성을 반환하도록 하는 map 함수
  • 멤버 참조를 사용해서 할 수 있다
// 1
people.filter {it.age == people.maxBy(Person::age)!!.age}

// 2
val maxAge = people.maxBy(Person::age)!!.age
people.filter{it.age == maxAge}
  • !!.
    • Person 객체에 age 값이 없는 경우 오류를 나타내도록 사용
    • 코드 작성시 !!. 을 사용할 때와 ?.를 사용해야 할 때 구분을 잘 못하겠음
  • 예제 1
    • maxBy가 filter 메소드 안에 있어서 people 리스트 원소 개수 만큼 계산되게 된다
  • 예제 2
    • maxBy 함수는 한번 수행된다
val numbers = mapOf(0 to "zero", 1 to "one")
println(numbers.mapValues { it.value.toUpperCase() })
  • map도 kotlin의 collection 중 일부이므로 동일하게 filter, map 기능을 사용할 수 있지만,
    • key : filterKeys, mapKeys
    • value : filterValues, mapValues
    • 이렇게 key, value 따라서 별개의 함수를 사용한다

👹 all, any, count, find

val canBeInClub27 = {p:Person -> p.age <= 27}

val people = listOf(Person("Alice", 27), Person("Bob", 31))

println(people.all(canBeInClub27))
println(people.any(canBeInClub27))
println(people.count(canBeInClub27))
println(people.find(canBeInClub27))
  • all
    • 모두 27세 이하인가
  • any
    • 하나라도 27세 이하인가
  • count
    • 27세 이하인 원소 개수
  • find
    • 27세 이하인 원소 한개
    • 있으면 맨 앞에 것, 없으면 null 반환
    • find vs firstOrNull
      • 조건을 만족하는 원소가 없으면 null 이 나온다는 사실을 명시하고 싶을때 firstOrNull 사용
  • 가독성을 위해 !로 부정을 붙일때는 all, any 앞 말고 조건문에 적용하자

🤡 groupBy : 리스트를 여러 그룹으로 이뤄진 맵으로 변경

  • return 값은 맵 형식
    • key
      • 원소를 구분하는 특성
    • value
      • 원소가 모인 list
    • Map<T, List>

⛑ flatMap과 flatten : 중첩된 컬렉션 안의 원소 처리

class Book(val title:String, val authors : List<String>)
books.flatMap{it.authors}.toSet()
  • books : Book 객체들이 모인 collection
  • flatMap
    • 여러 리스트들을 한개의 리스트로 flatten 한다
  • 중첩된 리스트를 한 리스트로 모아야 할때
    • books.flatMap{it}
    • books.flatten()
    • flatMap 해서 특별히 다르게 반환해야 할 내용이 없다면 그냥 바로 flatten 하면 된다

Reference

반응형