Image
Kotlin/Collection

[Kotlin Collection] 2. Kotlin filter, take, drop 을 이용해 데이터 필터링 하기

목차로 돌아가기

 

[Kotlin Collection] Kotlin에서 확장함수를 이용해 Collection 조작하기

목표 Collection 확장함수가 하는 일을 이해한다. 자유롭게 확장 함수를 이용해 데이터를 조작한다. 개요  Kotlin에서는 일반 컬렉션에도 함수형 프로그래밍을 위한 확장 함수를 제공하여, 데이터를

kotlinworld.com

 

목표

  • 필터링 함수 filter, take, drop의 개념을 익힌다.
  • filter을 사용하는 방법을 익힌다.
  • take을 사용하는 방법을 익힌다.
  • drop을 사용하는 방법을 익힌다.

확장함수 목록

filter

filter는 Collection이 확장하는 Iterable인터페이스의 확장함수로 특정한 조건을 적용하여 Collection의 데이터를 필터링합니다. 코틀린에서는 다양한 필터 확장함수를 제공합니다.

 

  • filter : filter는 Iterable 속의 'T타입 element를 입력으로 받아 Boolean을 반환하는 함수형 변수'를 입력으로 받습니다. 만약 Boolean이 true일 경우 해당 값은 반환되는 List에 포함되고 false일 경우 포함되지 않습니다. Collection 자체를 바꾸는 것이 아닌, 반환 값으로 새로운 List를 만들어냅니다.
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> 
val exampleList = mutableListOf(1, 2, 3)
val filteredList = exampleList.filter { it != 2 } // filtertedList = [1, 3]

 

  • filterIndexed : filterIndexed는 'Iterable 속의 element의 index와 T타입 element를 입력으로 받아 Boolean을 반환하는 함수형 변수'를 입력으로 받습니다. 만약 Boolean이 true일 경우 해당 값은 반환되는 List에 포함되고 false일 경우 포함되지 않습니다. Collection 자체를 바꾸는 것이 아닌, 반환 값으로 새로운 List를 만들어냅니다.
public inline fun <T> Iterable<T>.filterIndexed(predicate: (index: Int, T) -> Boolean): List<T>
val exampleList = mutableListOf(1, 2, 3)
val filteredList = exampleList.filterIndexed { index, i -> i != 2 && index != 0 }
print(filteredList) // [3]

 

  • filterIsInstance : filterIsInstance는 특정한 Class나 Interface의 Instance인 경우만을 필터링합니다. 아래 예제에서는 상위 타입(Collection)을 인자로 같은 MutableList를 만든 후 안에 list와 set 그리고 mutableList를 차례로 넣었습니다. 그 후 List를 구현하는 인스턴스만을 filtering 하였습니다. 따라서 첫번째(List)와 마지막(MutableList) Collection만이 필터링됩니다. 
public inline fun <reified R> Iterable<*>.filterIsInstance(): List<@kotlin.internal.NoInfer R>
val collectionList : MutableList<Collection<Int>> = mutableListOf(listOf(1,2,3),setOf(1,2), mutableListOf(2)) 
collectionList.filterIsInstance<List<Int>>() // [[1, 2, 3], [2]]

 

 

take

take는 Collection의 앞 혹은 뒤에서부터 얼마만큼의 원소를 가지고 새로운 List를 만들 것인지 결정하는 확장함수입니다.

 

  • take : take는 얼마만큼의 값을 에서부터 취할지를 n 이라는 인수로 받습니다. Collection의 앞에서부터 n만큼만 취해 List를 반환합니다.
public fun <T> Iterable<T>.take(n: Int): List<T>
(0..10).toList().take(3) // [0, 1, 2]

 

  • takeWhile : takeWhile은 predicate 조건이 false가 될때까지 앞에서부터 인수를 취해 List로 반환합니다. 아래 예제에서는 it이 6미만일 때까지만 take하므로, 0부터 5에 해당하는 List가 반환됩니다.
public inline fun <T> Iterable<T>.takeWhile(predicate: (T) -> Boolean): List<T>
(0..10).toList().takeWhile { it < 6 } // [0, 1, 2, 3, 4, 5]

 

  • takeLast : takeLast는 얼마만큼의 값을 에서부터 취할지를 n 이라는 인수로 받습니다. Collection의 뒤에서부터 n만큼만 취해 List를 반환합니다.
(0..10).toList().takeLast(3) // [8, 9, 10]

 

 

  • takeLastWhile : takeLastWhile은 predicate 조건이 false가 될때까지 뒤에서부터 인수를 취해 List로 반환합니다. 아래 예제에서는 it이 5초과일 때까지만 take하므로, 6부터 10에 해당하는 List가 반환됩니다.
(0..10).toList().takeLastWhile { it > 5 }

 

  • takeIf: takeIf는 엄밀히 말해 Collection만을 위한 확장 함수가 아닙니다. takeIf는 확장함수의 수신객체가 특정 조건을 만족시키는지 확인 후 만족한다면 수신객체 자체를 불만족한다면 null을 반환시키는 함수입니다.
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? 
(0..10).toList().takeIf { list -> list.size <= 20 } // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
"string".takeIf { it == "string" } // "string"
"string".takeIf { it == "string1" } // null

 

 

drop

drop은 Collection의 앞 혹은 뒤에서부터 얼마만큼의 원소를 제거하고 새로운 List를 만들 것인지 결정하는 확장함수입니다.

 

  • drop : drop은 얼마만큼의 값을 에서부터 버릴지를 n 이라는 인수로 받습니다. Collection의 앞에서부터 n만큼만 버린 List를 반환합니다.

 

public fun <T> Iterable<T>.drop(n: Int): List<T>
(0..10).toList().drop(3) // [3, 4, 5, 6, 7, 8, 9, 10]

 

  • dropWhile : dropWhile은 predicate 조건이 false가 될때까지 앞에서부터 인수를 버리고 List로 반환합니다. 아래 예제에서는 it이 5미만일 때까지만 drop하므로, 5부터 10에 해당하는 List가 반환됩니다.
public inline fun <T> Iterable<T>.dropWhile(predicate: (T) -> Boolean): List<T> 
(0..10).toList().dropWhile { it < 5 } // [5, 6, 7, 8, 9, 10]

 

  • dropLast : dropLast는 얼마만큼의 값을 에서부터 버릴지를 n 이라는 인수로 받습니다. Collection의 뒤에서부터 n만큼만 버린 List를 반환합니다.
(0..10).toList().dropLast(3) // [0, 1, 2, 3, 4, 5, 6, 7]

 

  • dropLastWhile : dropLastWhile은 predicate 조건이 false가 될때까지 뒤에서부터 인수를 버려 List로 반환합니다. 아래 예제에서는 it이 5초과일 때까지만 drop하므로, 0부터 5에 해당하는 List가 반환됩니다.
(0..10).toList().dropLastWhile { it > 5 } // [0, 1, 2, 3, 4, 5]
반응형

 

이 글의 저작권은 '조세영의 Kotlin World' 에 있습니다. 글, 이미지 무단 재배포 및 변경을 금지합니다.

 

 

Kotlin, Android, Spring 사용자 오픈 카톡

오셔서 궁금한 점을 질문해보세요!
비밀번호 : kotlin22

open.kakao.com