List 아이템 부분추출 함수 정리 # take, takeWhile, takeLast, drop, slice, first and last
오늘은 list 나 Sequence에 적용할 수 있는,
아이템을 부분적으로 추출하는 방법에 대해서 정리해 보도록 하겠습니다.
오늘 볼 API에는 다음과 같은 것들이 있는데요.
- take, takeLast, takeWhile, drop, dropWhile, slice
- first, last, firstOrNull, lastOrNull
하나씩 보도록 하겠습니다.
1. take
api 이름에서 느껴지는 것처럼, 처음 n개의 요소들을 반환해 줍니다.
아래 코드에서는 처음3개를 취하기 위해서, 3을 인자로 넣어주었구요.
결과는 앞의 1,2,3을 반환해 주게 됩니다.
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.take(3)
println(result) // 결과: [1, 2, 3]
2. takeLast
takeLast API는 마지막 몇개의 아이템을 추출해 줍니다.
아래에서는 마지막 3개의 값을 받기위해서 3을 인자로 넣어주었습니다.
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.takeLast(3)
println(result) // 결과: [3, 4, 5]
이 글의 맥락에서 조금 벗어날 수 있지만, takeLast는 String에도 유용하게
3. drop
take와는 반대의 개념이라고 보면 되는데요.
처음 n개의 아이템들을 제외하고 반환해주도록 하는 함수입니다.
아래에서는 처음3개를 제외하고 반환하도록 하기 위해서,
3을 인자로 넣어주었습니다.
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.drop(3)
println(result) // 결과: [4, 5]
4. takeWhile 과 dropWhile
4-1. takeWhile
조건을 걸어서 필터링을 할수도 있는데요.
take 함수에 람다식으로 블록안에 조건을 넣어주면 됩니다.
아래에서는 4보다 작은경우만 리턴해주도록 블록안에,
'it < 4' 의 코드를 넣어주었습니다.
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.takeWhile { it < 4 }
println(result) // 결과: [1, 2, 3]
4-2. dropWhile
3번 drop에서 본 것처럼,
drop은 n개의 아이템을 제외하고 반환해 줄 때 사용합니다.
아래에서는 3보다 작은경우는 drop 시키도록 하였습니다.
val numbers = listOf(1, 2, 3, 4, 5, 6)
val result = numbers.dropWhile { it < 3 }
println(result) // 결과: [3, 4, 5, 6]
5. slice
특정한 인덱스를 지정해서 값을 반환받을 때 쓰이는데요.
반환받을 인덱스를 지정하는 방법도 다양합니다.
단순히 처음과 끝의 인덱스를 아래와 같이 지정할 수도 있구요.
val numbers = listOf(1, 2, 3, 4, 5)
val result = numbers.slice(listOf(1, 3))
println(result) // 결과: [2, 4]
공식문서에 나온 것처럼, 아래와 같이 지정하는 것도 가능합니다.
range를 사용하거나, set 같은 collection을 사용하는 것도 가능합니다.
println(numbers.slice(1..3)) //결과: [2, 3, 4]
println(numbers.slice(0..4 step 2)) //결과: [1, 3, 5]
println(numbers.slice(setOf(3, 4, 0))) //결과: [4, 5, 1]
6. first()
6-1. first()
이 API는 첫번째 아이템을 반환해 줍니다.
만약 첫번째 아이템이 없다면, NoSuchElementException 을 throw 합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val firstNumber = numbers.first()
println(firstNumber) // 결과: 1
6-2. firstOrNull()
아이템이 없을 경우 Exception 대신 null을 반환하도록 할 수 있는데요.
이 때, firstOrNull 을 사용해주면 됩니다.
val list = listOf(1, 2, 3)
val firstElement = list.firstOrNull()
println(firstElement) // 결과: 1
val emptyList = emptyList<Int>()
val nullElement = emptyList.firstOrNull()
println(nullElement) // 결과: null
6-2.first vs take
한가지 생각해 둘 점은 아래의 경우입니다.
take 의 경우 하나라도 그 반환되는 값은 list 입니다.
그런데, first()의 경우 해당하는 아이템을 list로 싸지 않고 반환해 줍니다.
val numbers = listOf(1, 2, 3, 4, 5)
val firstNumber = numbers.first()
println(firstNumber) // 결과: 1
val firstElementList = numbers.take(1)
println(firstElementList) // 결과: [1]
경우에 따라서,
first()가 리스트에서 꺼낼필요 없이 효율적으로 사용할 수 있겠지요.
7. last()
7-1. last
last 함수는 위와는 반대로 가장 마지막의 아이템을 리턴해주는 API입니다.
위의 first()와 last() 의 차이처럼 결과값은 리스트가 아닙니다.
마지막 아이템을 그대로 리턴해 줍니다.
만약 마지막 아이템이 없다면, NoSuchElementException 을 throw 합니다.
val numbers = listOf(1, 2, 3, 4, 5)
val lastNumber = numbers.last()
println(lastNumber) // 결과: 5
7-2. lastOrNull
아이템이 없을 경우, Exception 대신 null 을 리턴해 주도록 하는 API 입니다.
val list = listOf(1, 2, 3)
val lastElement = list.lastOrNull()
print(lastElement) // 결과: 3
val emptyList = emptyList<Int>()
val nullElement = emptyList.lastOrNull()
print(nullElement) // 결과: null
이상으로 부분추출에 사용할 수 있는 함수들에 대해서 정리해 보았습니다.