[kotlin]3章関数の定義と呼び出し-2
30268 ワード
3.4収集処理
コトリン言語特性
JavaコレクションAPIの拡張
last()
val strings: List<String> = listOf("first", "second", "last")
println(strings.last())
>>> last
実装は、次のリストの拡張関数によって実現されます.max()
val numbers: Collection<Int> =setOf(1, 14, 2)
println(numbers.max())
→コードエラー1.4バージョン後に破棄され、maxOfNull()を使用します.かへんパラメータかんすう
上で使用したlistOf()は次のように定義されています.
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()
...
vararg
fun main(args: Array<String>) {
val list = listOf("args: ", *args)
println(list)
}
中尉コールと構造分解宣言
val map = mapOf(1 to "one", 7 to "seven", 53 to "fifty-three")
に示すように、mapを作成すると、toはtoという一般的なメソッドを呼び出します.中尉コール
構造分解宣言
infix fun Any.to(other: Any) = Pair(this, other)
上記の宣言のto()はPairの構造分解宣言であり,2つの変数を直ちに初期化する.val (number, name) = 1 to "one"
for ((index, element) in collection.withIndex()) {
println("$index: $element")
}
文字列と正規表現の操作
文字列の分割
パラメータはRegexタイプを受け入れます.
println("12.345-6.A".split("\\.|-".toRegex()))
>>> [12, 345, 6, A]
→エラーの正規表現構文はjavaと同じJava split overloading
println("12.345-6.A".split(".", "-"))
>>> [12, 345, 6, A]
→複数の区切り文字を使用可能三重引用符文字列
ディレクトリ、ファイル名、拡張子を使用してファイルパスを区切る
fun parsePath(path: String) {
val directory = path.substringBeforeLast("/")
val fullName = path.substringAfterLast("/")
val fileName = fullName.substringBeforeLast(".")
val extension = fullName.substringAfterLast("/")
println("Dir: $directory, name: $fileName, ext: $extension")
}
fun main() {
parsePath("/Users/yole/kotlin-book/chapter.doc")
}
fun parsePath(path: String) {
val regex = """(.+)/(.+)\.(.+)""".toRegex()
val matchResult = regex.matchEntire(path)
if (matchResult != null) {
val (directory, filename, extension) = matchResult.destructured
println("Dir: $directory, name: $filename, ext: $extension")
}
}
fun main() {
parsePath("/Users/yole/kotlin-book/chapter.doc")
}
→""":三引用符文字列では、任意の文字がxをエスケープする必要があります.複数行の三重引用符文字列
fun main() {
val kotlinLogo = """| //
.| //
.|/\"""
println(kotlinLogo.trimMargin("."))
}
>>> | //
>>> | //
>>> |/\
文字列にテキストが含まれている場合は、→のように簡単に文字列に変換できます.ローカル関数の拡張
import java.lang.IllegalArgumentException
class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User) {
if (user.name.isEmpty()) {
throw IllegalArgumentException("name null")
}
if (user.address.isEmpty()) {
throw IllegalArgumentException("address null")
}
}
fun main() {
saveUser(User(1, "", ""))
}
→関数は複雑ではありませんが、検証コードが重複しますimport java.lang.IllegalArgumentException
class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User) {
fun validate(user: User, value: String, fieldName: String) {
if (value.isEmpty()) {
throw IllegalArgumentException("$[user.id]: null $fieldName")
}
}
validate(user, user.name, "Name")
validate(user, user.address, "Address")
}
fun main() {
saveUser(User(1, "", ""))
}
→メソッドで重複する検証部分を抽出し、元の関数の内部に重ね合わせる→userオブジェクトをローカル関数に1つずつ渡す必要があります
import java.lang.IllegalArgumentException
class User(val id: Int, val name: String, val address: String)
fun saveUser(user: User) {
fun validate(value: String, fieldName: String) {
if (value.isEmpty()) {
throw IllegalArgumentException("$[user.id]: null $fieldName")
}
}
validate(user.name, "Name")
validate(user.address, "Address")
}
fun main() {
saveUser(User(1, "", ""))
}
→ローカル関数を使用して、その属する外部関数のすべてのパラメータと変数を使用できます.import java.lang.IllegalArgumentException
class User(val id: Int, val name: String, val address: String)
fun User.validateBeforeSave(user: User) {
fun validate(value: String, fieldName: String) {
if (value.isEmpty()) {
throw IllegalArgumentException("$[user.id]: null $fieldName")
}
}
validate(name, "Name")
validate(address, "Address")
}
fun saveUser(user: User) {
user.validateBeforeSave(user)
}
fun main() {
saveUser(User(1, "", ""))
}
→拡張関数として抽出:この検証ロジックは、ユーザー以外の場所では使用されないため、含めたくありません.
Reference
この問題について([kotlin]3章関数の定義と呼び出し-2), 我々は、より多くの情報をここで見つけました https://velog.io/@woo0_hooo/kotlin-3장-함수의-정의와-호출-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol