반응형
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
>
- key
⛑ 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
반응형
'Languages' 카테고리의 다른 글
java 함수에 kotlin lambda 식 메소드로 전달하기 (자바 함수형 인터페이스) (0) | 2020.04.26 |
---|---|
kotlin의 lazy evaluation (sequence, map, filter) (0) | 2020.04.26 |
kotlin에서의 람다식과 멤버 참조 (lambda, ::, 값으로 표현된 함수) (0) | 2020.04.26 |
kotlin in Action 4장 예제 (by, selaed, factory method, constructor) (0) | 2020.04.26 |
kotlin의 가시성 (open, final, abstract), 생성자 (0) | 2020.04.19 |