dkdud9261 / develop-log

BE 개발자의 현업 이슈 정리 🌟
3 stars 0 forks source link

[Kotlin] 별의별 코틀린 표준 라이브러리(Iterable, String) #9

Open dkdud9261 opened 1 month ago

dkdud9261 commented 1 month ago

indices

val CharSequence.indices: IntRange

문자 시퀀스에 대해 유효한 문자 인덱스 range를 반환한다.

usage

val str = "hello"
println(str.indices) // 0..4

문자열의 각 문자를 인덱스로 탐색할 때 Iterable 함수랑 연계해서 사용하면 유용하다.

dkdud9261 commented 1 month ago

joinToString

fun <T> Iterable<out T>.joinToString(
    separator: CharSequence = ", ",
    prefix: CharSequence = "",
    postfix: CharSequence = "",
    limit: Int = -1,
    truncated: CharSequence = "...",
    transform: ((T) -> CharSequence? = null
): String

각 원소를 seperator로 연결하여 하나의 문자열을 만든다.

val numbers = listOf(1, 2, 3, 4, 5, 6)
println(numbers.joinToString()) // 1, 2, 3, 4, 5, 6
println(numbers.joinToString(prefix = "[", postfix = "]")) // [1, 2, 3, 4, 5, 6]
println(numbers.joinToString(prefix = "<", postfix = ">", separator = "•")) // <1•2•3•4•5•6>

val chars = charArrayOf('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q')
println(chars.joinToString(limit = 5, truncated = "...!") { it.uppercaseChar().toString() }) // A, B, C, D, E, ...!
dkdud9261 commented 1 month ago

zip

infix fun <T, R> Iterable<T>.zip(
    other: Iterable<R>
): List<Pair<T, R>>

val listA = listOf("a", "b", "c")
val listB = listOf(1, 2, 3, 4)
println(listA zip listB) // [(a, 1), (b, 2), (c, 3)]
inline fun <T, R, V> Iterable<T>.zip(
    other: Iterable<R>,
    transform: (a: T, b: R) -> V
): List<V>

val listA = listOf("a", "b", "c")
val listB = listOf(1, 2, 3, 4)
val result = listA.zip(listB) { a, b -> "$a$b" }
println(result) // [a1, b2, c3]

요런 표준 라이브러리는 보통 Iterable, Array ... 등에 다 있다.

dkdud9261 commented 1 month ago

downTo와 step

infix fun Int.downTo(to: Int): IntProgression

this에서 to까지 -1 되는 시퀀스를 반환한다. delta를 지정할 수 있고, Int, Long, Byte, Short ... 에서 가능하다. XProgressionIterable을 상속한다.

('e' downTo 'a' step 2).forEach { println(it) }

/*
  e
  c
  a
*/
dkdud9261 commented 1 month ago

fold

inline fun <T, R> Iterable<T>.fold(
    initial: R,
    operation: (acc: R, T) -> R
): R

초기값에서 각 원소들에 대해 operation 으로 누적한 값을 반환한다.

val result = listOf(1, 2, 3, 4, 5).fold(0) { acc, num -> acc + num }

println(result) // 15