Trong những bài trước chúng ta đã tìm hiểu các cú pháp cơ bản trong lập trình Kotlin. Với Kotlin, các cấu trúc điều khiển if else, vòng lặp for, while, do white.. cũng tương tự như với ngôn ngữ lập trình khác. Trong bài viết này hướng dẫn các bạn về các hàm xử lý chuỗi – xử lý String trong lập trình Kotlin.
Các bạn có thể tham khảo về Kotlin là gì? nếu bạn là người mới bắt đầu với Kotlin. Hoặc tìm hiểu về các cú pháp cơ bản trong lập trình Kotlin.
Lớp String đại diện cho các chuỗi ký tự. Tất cả các ký tự chuỗi trong lập trình Kotlin, chẳng hạn như “abc”, được triển khai dưới dạng các thể hiện của lớp này.
Để tìm hiểu chi tiết về cách làm việc với chuỗi String trong Kotlin bạn cũng có thể tham khảo bài viết https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/
Ngoài việc xử lý chuỗi, xử lý mảng trong Kotlin là nội dung bạn cũng cần tìm hiểu thêm nếu muốn làm tốt với Kotlin.
Như trên website chính thức của ngôn ngữ Kotlin, thì String có thuộc tính length với nhiệm vụ trả về độ dài của chuỗi.
val length: Int
Trong Kotlin, Hàm compareTo dùng để so sánh đối tượng này với đối tượng khác. Kết quả trả về bằng 0 nếu 2 đối tượng bằng nhau. Kết quả là một số âm nếu đối tượng hiện tại nhỏ hơn đối tượng so sánh và ngược lại kết quả là một số dương nếu đối tượng hiện tại lớn hơn đối tượng so sánh.
fun compareTo(other: String): Int
fun equals(other: Any?): Boolean
Hàm equals dùng để kiểm tra 2 đối tượng có bằng nhau hay không? Việc kiểm tra bằng nhau này cần đáp ứng 1 số tính chất như sau:
Tính phản xạ: Đối với bất kỳ giá trị x nào khác NULL thì kết quả của x.equals (x) phải trả về true.
Tính đối xứng: Đối với bất kỳ giá trị x và y thì x.equals (y) sẽ trả về true khi và chỉ khi y.equals (x) trả về true.
Tính bắc cầu: Đối với bất kỳ giá trị nào khác null x, y và z, nếu x.equals (y) trả về true và y.equals (z) trả về true, thì x.equals (z) sẽ trả về true.
Tính bền vứng: Đối với bất kỳ giá trị nào khác null x và y, các lệnh gọi x.equals(y) luôn trả về true hoặc luôn trả về false miến là không có thông tin nào được sử dụng giữa các phép so sánh đó.
Khác null: Đối với bất kỳ giá x khác null thì x.equals(null) luôn luôn trả về false.
fun get(index: Int): Char
Hàm get trả về ký tự của 1 chuỗi tại vị trí Index. Kiểu dữ liệu trả về là Char
fun hashCode(): Int
Trả về hashCode của 1 đối tượng object.
Hàm hashCode bất kì khi nào được gọi, nếu trên cùng một đối tượng, dù là bao nhiêu lần, hashCode
phải luôn trả về cùng một số nguyên, miễn là không có hành động nào làm thay đổi đối tượng trước đó.
Nếu hai đối tượng bằng nhau theo khi kiểm tra bằng hàm equals()
, thì việc gọi hashCode
trên mỗi đối tượng đó đều trả về kết quả giống nhau
operator fun plus(other: Any?): String
Hàm plus cho phép nối chuỗi hiện tại với chuỗi được truyền vào. Kết quả trả về là chuỗi đã được nối.
fun subSequence(startIndex: Int, endIndex: Int): CharSequence
Hàm subSequence trả về một chuỗi ký tự mới là một dãy con của chuỗi ký tự hiện tại. Chuỗi mới được cắt từ chuỗi hiện tại từ startIndex và kết thúc ngay trước endIndex.
Trong đó
startIndex: Vị trí bắt đầu cắt chuỗi
endIndex: Vị trí kết thúc chuỗi
fun toString(): String
Hàm trả về giá trịnh String của đối tượng hiện tại
val CharSequence.indices: IntRange
Thuộc tính này trả về 1 khoảng (mảng) chỉ số (index) hợp lệ của 1 chuỗi ký tự.
val CharSequence.lastIndex: Int
Thuộc tính lastIndex trả về chỉ số của ký tự cuối cùng trong chuỗi ký tự hoặc -1 nếu ký tự đó rỗng.
inline fun CharSequence.all( predicate: (Char) -> Boolean ): Boolean
Hàm all trả về true nếu tất cả các ký tự của chuỗi đều thỏa mãn điều kiện cho vào. Xem thêm ví dụ sau:
val isEven: (Int) -> Boolean = { it % 2 == 0 } val zeroToTen = 0..10 println("zeroToTen.all { isEven(it) } is ${zeroToTen.all { isEven(it) }}") // false println("zeroToTen.all(isEven) is ${zeroToTen.all(isEven)}") // false val evens = zeroToTen.map { it * 2 } println("evens.all { isEven(it) } is ${evens.all { isEven(it) }}") // true val emptyList = emptyList<Int>() println("emptyList.all { false } is ${emptyList.all { false }}") // true
Hàm này sẽ trả về True nếu chuỗi có ít nhất 1 ký tự
fun CharSequence.any(): Boolean
val emptyList = emptyList<Int>() println("emptyList.any() is ${emptyList.any()}") // false val nonEmptyList = listOf(1, 2, 3) println("nonEmptyList.any() is ${nonEmptyList.any()}") // true
Một biến thể khác của hàm any
inline fun CharSequence.any( predicate: (Char) -> Boolean ): Boolean
Hàm any trả về True nếu ít nhất 1 ký tự thỏa mãn điều kiện truyền vào.
val isEven: (Int) -> Boolean = { it % 2 == 0 } val zeroToTen = 0..10 println("zeroToTen.any { isEven(it) } is ${zeroToTen.any { isEven(it) }}") // true println("zeroToTen.any(isEven) is ${zeroToTen.any(isEven)}") // true val odds = zeroToTen.map { it * 2 + 1 } println("odds.any { isEven(it) } is ${odds.any { isEven(it) }}") // false val emptyList = emptyList<Int>() println("emptyList.any { true } is ${emptyList.any { true }}") // false
Hàm capitalize trả về bản sao của chuỗi hiện tại, chuỗi này sẽ có chữ cái đầu tiên được viết hoa
@DeprecatedSinceKotlin("1.5") fun String.capitalize(): String
Tuy nhiên trong phiên bản hiện tại hàm capitalize đã bị Deprecated và thay thế bằng hàm replaceFirstChar
println("abcd".capitalize()) // Abcd println("Abcd".capitalize()) // Abcd
@DeprecatedSinceKotlin("1.6") fun String.concat( str: String ): String
Hàm concat dùng để nối chuỗi hiện tại với chuỗi được truyền vào. Tuy nhiên hàm concat đã bị deprecate thay thế bằng hàm plus.
operator fun CharSequence.contains( other: CharSequence, ignoreCase: Boolean = false ): Boolean
operator fun CharSequence.contains( char: Char, ignoreCase: Boolean = false ): Boolean
operator fun CharSequence.contains(regex: Regex): Boolean
Hàm contains trả về true nếu chuỗi ký tự này chứa chuỗi ký tự được truyền vào dưới dạng chuỗi con.
Tham số ignoreCase mặc định là false, nghĩa là không phân biệt chữ hoa chữ thường giữa 2 chuỗi.
fun CharSequence.count(): Int
Hàm count trả về độ dài của chuỗi kí tự hiện tại.
Ngoài ra hàm count có một nạp chồng khác
inline fun CharSequence.count( predicate: (Char) -> Boolean ): Int
Khi đó hàm count sẽ trả về số lượng ký tự thỏa mãn điều kiện predicate.
fun String.endsWith( suffix: String, ignoreCase: Boolean = false ): Boolean
Hàm endsWith sẽ trả về true nếu chuỗi này kết thúc bằng chuỗi được truyền vào.
fun CharSequence.endsWith( char: Char, ignoreCase: Boolean = false ): Boolean
Với hàm endsWith nạp chồng này, thì kết quả trả về true nếu chuỗi ký tự này kết thúc bằng ký tự được chỉ định.
fun CharSequence.endsWith( suffix: CharSequence, ignoreCase: Boolean = false ): Boolean
inline fun CharSequence.filter( predicate: (Char) -> Boolean ): CharSequence
Hàm filter trong Kotlin sẽ trả về một chuỗi ký tự chỉ chứa các ký tự từ chuỗi ký tự gốc phù hợp với điều kiện đã cho.
val text = "a1b2c3d4e5" val textWithOnlyDigits = text.filter { it.isDigit() } println(textWithOnlyDigits) // 12345
Biến thể khác của hàm filter
inline fun String.filter( predicate: (Char) -> Boolean ): String
Trả về một chuỗi chỉ chứa các ký tự phù hợp hàm điều kiện đã cho.
val text = "a1b2c3d4e5" val textWithOnlyDigits = text.filter { it.isDigit() } println(textWithOnlyDigits) // 12345
inline fun CharSequence.find( predicate: (Char) -> Boolean ): Char?
Trả về ký tự đầu tiên phù hợp với điều kiện đã cho hoặc null nếu không tìm thấy ký tự nào như vậy.
val numbers = listOf(1, 2, 3, 4, 5, 6, 7) val firstOdd = numbers.find { it % 2 != 0 } val lastEven = numbers.findLast { it % 2 == 0 } println(firstOdd) // 1 println(lastEven) // 6
fun CharSequence.first(): Char
Hàm first trả về kí tự đầu tiên của chuỗi
Hàm này sẽ ném ra ngoại lệ NoSuchElementException
trong trường hợp chuỗi kí tự rỗng.
Hàm format chuỗi là 1 trong các hàm hay được sử dụng trong nhiều ngôn ngữ lập trình. Hàm format string mang lại sự tiện lợi nhất định thay vì cộng nhiều chuỗi ngắn lại với nhau.
fun String.format(vararg args: Any?): String
Chuỗi hiện tại chứa các định dạng, sau khi qua hàm format, chuỗi trả về là chuỗi đã được thay thế các đối số được chỉ định.
fun String.Companion.format( format: String, vararg args: Any? ): String
Một biến thể khác của hàm format, với hàm này thì sẽ định dạng 1 chuỗi String truyền vào thay vì đối tượng String hiện tại.
fun CharSequence.indexOf( char: Char, startIndex: Int = 0, ignoreCase: Boolean = false ): Int
Hàm indexOf trả về vị trí đầu tiên của ký tự truyền vào trong chuỗi hiện tại, được tính từ vị trí startIndex
Hàm này có 3 tham số truyền vào
char: là ký tự cần xác định vị trí
startIndex: bắt đầu từ index nào trong chuỗi, mặc định là 0
ignoreCase: có phân biệt chữ hoa chữ thường hay không, mặc định là false
Kết quả trả về là giá trị index của ký tự, hoặc trả về -1 nếu không tìm thấy
fun CharSequence.isEmpty(): Boolean
Hàm isEmpty trả về true nếu chuỗi ký tự này rỗng (không chứa ký tự).
fun markdownLink(title: String, url: String) = if (title.isEmpty()) url else "[$title]($url)" // plain link println(markdownLink(title = "", url = "https://kotlinlang.org")) // https://kotlinlang.org // link with custom title println(markdownLink(title = "Kotlin Language", url = "https://kotlinlang.org")) // [Kotlin Language](https://kotlinlang.org)
fun CharSequence.isNotBlank(): Boolean
Hàm isNotBlank trả về true nếu chuỗi ký tự này không trống và chứa một số ký tự ngoại trừ các ký tự khoảng trắng.
fun validateName(name: String): String { require(name.isNotBlank()) { "Name cannot be blank" } return name } println(validateName("Adam")) // Adam // validateName("") // will fail // validateName(" \t\n") // will fail
fun CharSequence.lastIndexOf( char: Char, startIndex: Int = lastIndex, ignoreCase: Boolean = false ): Int
Hàm lastIndexOf trả về vị trí xuất hiện cuối cùng của char trong chuỗi ký tự hiện tại, bắt đầu từ startIndex được chỉ định.
Hàm lastIndexOf có 3 tham số
char: Kí tự cần xác định vị trí
startIndex: vị trí bắt đầu để tìm kiếm char
ignoreCase: cờ cho biết tìm kiếm có phân biệt hoa thường hay không, mặc định là false.
Kết quả trả về là vị trí của char trong chuỗi hiện tại, hoặc là -1 nếu không tìm thấy kí tự đó
fun Char.lowercase(): String
Chuyển đổi ký tự hiện tại thành chữ thường theo quy tắc ánh xạ Unicode.
Hàm này hỗ trợ ánh xạ một đến nhiều ký tự, do đó độ dài của chuỗi trả về có thể lớn hơn chuỗi đầu vào. ví dụ ‘\u0130’.lowercase() có kết quả là “\u0069\u0307”, trong đó ‘\u0130’ là ký tự latin viết hoa với dấu nặng trên đầu (chữ İ). Nếu 1 chuỗi mà không có ánh xạ chữ thường, thì kết quả từ toString của ký tự đó sẽ được trả về.
val chars = listOf('A', 'Ω', '1', 'a', '+', 'İ') val lowercaseChar = chars.map { it.lowercaseChar() } val lowercase = chars.map { it.lowercase() } println(lowercaseChar) // [a, ω, 1, a, +, i] println(lowercase) // [a, ω, 1, a, +, \u0069\u0307]
Hàm lowercase với String
fun String.lowercase(): String
Hàm này trả về chuỗi viết thường của chuỗi hiện tại theo quy tắc ánh xạ Unicode.
println("Iced frappé!".lowercase()) // iced frappé!
fun CharSequence.random(): Char
Trả về một ký tự ngẫu nhiên từ chuỗi ký tự hiện tại.
Hàm này ném ra lỗi NoSuchElementException
nếu chuỗi ký tự này rỗng.
fun CharSequence.random(random: Random): Char
Trả về một ký tự ngẫu nhiên từ chuỗi ký tự hiện tại bằng cách sử dụng nguồn ngẫu nhiên được chỉ định.
fun String.replace( oldChar: Char, newChar: Char, ignoreCase: Boolean = false ): String
Trả về một chuỗi mới với tất cả các lần xuất hiện của oldChar được thay thế bằng newChar.
val inputString0 = "Mississippi" val inputString1 = "Insufficient data for meaningful answer." println(inputString0.replace('s', 'z')) // Mizzizzippi println(inputString1.replace("data", "information")) // Insufficient information for meaningful answer.
Một biến thể khác của hàm replace
fun String.replace( oldValue: String, newValue: String, ignoreCase: Boolean = false ): String
val inputString0 = "Mississippi" val inputString1 = "Insufficient data for meaningful answer." println(inputString0.replace('s', 'z')) // Mizzizzippi println(inputString1.replace("data", "information")) // Insufficient information for meaningful
fun CharSequence.reversed(): CharSequence
fun String.reversed(): String
Hàm reversed trả về chuỗi với các ký tự bị đảo ngược.
fun CharSequence.split( vararg delimiters: String, ignoreCase: Boolean = false, limit: Int = 0 ): List<String>
Tách chuỗi ký tự hiện tại thành một danh sách các chuỗi dựa trên dấu phân cách
Hàm split có 3 tham số
delimiters: Chuỗi được sử dụng làm dấu phân cách, ví dụ như khoảng trắng, -, | …
ignoreCase: Phân biệt hoa thường nếu bằng true, mặc định là false
limit: Số chuỗi con tối đa để trả về. Mặc định là 0, có nghĩa là không có giới hạn nào được đặt.
fun String.startsWith( prefix: String, ignoreCase: Boolean = false ): Boolean
Trả về true nếu chuỗi này bắt đầu bằng tiền tố được chỉ định vào qua tham số.
fun String.startsWith( prefix: String, startIndex: Int, ignoreCase: Boolean = false ): Boolean
Trả về true nếu một chuỗi con của chuỗi này bắt đầu tại startIndex bù được chỉ định bắt đầu bằng tiền tố được chỉ định.
fun String.substring(startIndex: Int): String
Trả về một chuỗi con của chuỗi hiện tại bắt đầu tại startIndex được chỉ định và tiếp tục đến cuối chuỗi.
fun String.substring(startIndex: Int, endIndex: Int): String
Trả về chuỗi con của chuỗi này bắt đầu từ startIndex và kết thúc ngay trước endIndex.
inline fun CharSequence.trim( predicate: (Char) -> Boolean ): CharSequence
inline fun String.trim(predicate: (Char) -> Boolean): String
fun CharSequence.trim(vararg chars: Char): CharSequence
fun String.trim(vararg chars: Char): String
Trả về một chuỗi con của chuỗi ký tự này có các ký tự đầu và cuối khớp với điều kiện đầu vào.
Hàm uppercase
fun Char.uppercase(): String fun String.uppercase(): String fun Char.uppercase(locale: Locale): String fun String.uppercase(locale: Locale): String
Chuyển ký tự, chuỗi thành dạng chữ viết hoa sử dụng luật ánh xạ Unicode
Trong bài viết này Codetutam đã giới thiệu các bạn một số hàm xử lý chuỗi cơ bản trong lập trình Kotlin. Danh sách các hàm xử lý chuỗi của Kotlin tương đối nhiều, các bạn có thể tham khảo trong trang chính thức của Kotlin. Ngoài ra nếu các bạn cần hỗ trợ bất kì thông tin gì có thể để lại comment để cùng CodeTuTam nghiên cứu nhé
Bình luận: