728x90
반응형
✅ 컬렉션 함수형 API
- 함수형 프로그래밍 스타일을 사용하면 컬렉션을 다룰 때 편리함
- 대부분의 작업에 라이브러리 함수를 활용할 수 있으며 그로 인해 코드를 간결하게 작성할 수 있음
📌 필수적인 함수 : filter와 map
- filter와 map은 컬렉션을 활용할 때 기반이 되는 함수로 대부분의 컬렉션 연산을 이 두 함수를 통해 표현할 수 있음
- filter 함수는 컬렉션을 이터레이션하면서 주어진 람다에 각 원소를 넘겨 람다가 true를 반환하는 원소만 모음
- 컬렉션에서 원치 않는 원소를 제거
- 하지만 원소를 변환할 수는 없음
- 원소를 변환하기 위해서는 map 함수 사용
- map 함수는 주어진 람다를 컬렉션의 각 원소에 적용한 결과를 모아서 새 컬렉션을 만듦
/* filter 예제 */
val list = listOf(1, 2, 3, 4)
println(list.filter {it % 2 == 0}) // 짝수만 남음
// [2, 4]
data class Person(val name: String, val age: Int)
val people = listOf(Person("Alice", 29), Person("Bob", 31))
println(people.filter {it.age>30 })
// [Person(name=Bob, age=31)]
/* map 예제 */
val list = listOf(1, 2, 3, 4)
println(list.map {it * it})
// [1, 4, 9 ,16]
/* 혼용 예제 */
people.filter(it.age>30}.map(Person::name)
// [Bob]
📌 all, any, count, find : 컬렉션에 술어 적용
- all 과 any
- 컬렉션에 대해 자주 수행하는 연산으로 컬렉션의 모든 원소가 어떤 조건을 만족하는지 판단하는 연산
val canBeInClub27 = {p: Person -> p.age <= 27}
val people = listOf(Person("Alice", 27), Person("Bob", 31))
println(people.all(canBeInClub27) // 모든 원소가 술어를 만족하는지 판단
// false
println(people.any(canBeInClub27) // 술어를 만족하는 원소가 하나라도 있는지 판단
// true
- count
- 조건을 만족하는 원소의 개수 반환
val people = listOf(Person("Alice", 27), Person("Bob", 31))
println(people.count(canBeInclub27) // 술어를 만족하는 원소의 개수를 구함
// 1
- find
- 조건을 만족하는 첫 번째 원소 반환
val people = listOf(Person("Alice", 27), Person("Bob", 31))
println(people.find(canBeInClub27)) // 술어를 만족하는 원소를 하나 찾고 싶은 경우
// Person(name=Alice, age=27)
📌 groupBy : 리스트를 여러 그룹으로 이뤄진 맵으로 변경
- goupBy : 컬렉션의 모든 원소를 어떤 특성에 따라 여러 그룹으로 나누고 싶은 경우 사용
- 특성을 파라미터로 전달하여 컬렉션을 자동으로 구분
val people = listOf(Person("Alice", 29), Person("Bob", 31), Person("Carol", 31))
println(people.groupBy {it.age})
// {29=[Person(name=Alice, age=29], 31=[Person(name=Bob, age=31), Person(name=Carol, age=31)}
- 연산의 결과는 컬렉션의 원소를 구분하는 특성이 키이고, 키 값에 따른 각 그룹이 값인 맵
- groupBy의 결과 타입 : Map<Int, List<Object>>
📌 flatMap과 flatten : 중첩된 컬렉션 안의 원소 처리
- flatMap : 인자로 주어진 람다를 컬렉션의 모든 객체에 적용하고(매핑) 람다를 적용한 결과로 얻어지는 여러 리스트를 한 리스트에 한데 모음
val strings = listOf("abc", "def")
println(strings.flatMap {it.toList()})
// [a, b, c, d, e, f]
- toList 함수를 문자열에 적용하면 그 문자열에 속한 모든 문자로 이뤄진 리스트가 만들어짐
- 리스트의 리스트가 있는데 모든 중첩된 리스트의 원소를 한 리스트로 모아야 한다면 flatMap을 떠올릴 수 있음
- 하지만 특별히 변환해야 할 내용이 없는 경우 평평하게 펼치기만 하면 됨
- 그런 경우 listOfLists.flatten()과 같이 flatten 함수를 사용할 수 있음
var arr = arryOf(arryOf(1,2,3), arrayOf(4, 5, 6))
var arr2 = arr.flatten()
println(arr2)
// [1, 2, 3, 4, 5, 6]
728x90
반응형
'Studying > Kotlin' 카테고리의 다른 글
[Kotlin In Action] 5장. 람다로 프로그래밍(4) - 자바 함수형 인터페이스 활용 (0) | 2023.05.23 |
---|---|
[Kotlin In Action] 5장. 람다로 프로그래밍(3) - 지연 계산(lazy) 컬렉션 연산 (0) | 2023.05.22 |
[Kotlin In Action] 5장. 람다로 프로그래밍(1) - 람다 식과 멤버 참조 (0) | 2023.05.17 |
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(4) - object 키워드 : 클래스 선언과 인스턴스 생성 (0) | 2023.05.16 |
[Kotlin In Action] 4장. 클래스, 객체, 인터페이스(3) - 컴파일러가 생성한 메서드 : 데이터 클래스와 클래스 위임 (0) | 2023.05.16 |