Kotlinの特徴的なものを勝手に選んでご紹介
JavaやC#,C++,Pythonなど他の言語経験者向けです。
機能の説明がしやすいように例を書いているのでこの使い方が正しい保証はありません。
機能の理解をしてくれればそれでOKです
↑前回
変数宣言
Kotlinでは基本的にval
で変数を宣言します。
前回は便宜上var
を使用しましたが、再代入はバグの元ですもんね!!
型推論も、もちろんしてくれます。
val greeting = "やぁ"//自動でString型
greeting = "はろー"//エラー!!! 再代入だめ!!
データクラス
data class Config(var enable:Boolean,var name:String,var value:Int)
Config(true,"A",1) == Config(true,"A",1)//true
数値や文字列のように==
で比較ができます。
インスタンスが異なってもプロパティが等しければtrue
それ以外でfalse
です。
拡張関数
簡単に既存の型に関数を追加できます。
fun String.addFace(){
return this+"^-^)v"
}
"こんにちは".addFace()//"こんにちは^-^)v"
ラムダ式
みなさん大好きラムダ式ですよ!
ラムダ式はこのように書くことができます。
//引数なし、返り値なし
val func1:()->Unit={
println("Hi")
}
//返り値あり
val func2:()->Int={
19*3 //returnは要らない
}
//引数あり
val func3:(String)->Unit={
println("引数は $it")
}
val func4:(String,Int)->Unit={str,n->
println("引数は $str と $n")
}
val func5:String.()->String={
this+"^-^)b"
}
Unit
は他の言語で言うVoidみたいなものです。何も返さないときに使いましょう。
func3
以降が特徴的ですね。Kotlinではラムダ式の引数名を省略でき、it
を使用できます。(引数が複数の場合は不可)
{変数名-> 処理}
で名前を明示的につけることも可能です。
func5
は拡張関数のラムダ式版です。
()=>{}
みたいに長くなくてスッキリしてますね!
fun runFunc(func:()->Unit){
func()
}
runFunc({
println("らむだ")
})
// ↓
runFunc{
println("()が無くてもいいんですか!?")
}
Kotlinは要らない括弧を省略できるので更にスッキリしますね!!
スコープ関数
私が一番好きな機能です。ですがわかりやすい使用例が思いつきません・・・とりあえず使用例を書きました
data class Config(var enable:Boolean,var name:String,var value:Int)
fun getConfig()=Config(true,"Config!!!",1)
fun setConfig(config:Config)=TODO("なんか処理が走る")
fun main(){
val config=getConfig()
config.enable=false
config.value=100
setConfig(config)
}
なんでconfig
って何回も書かないといけないの・・?しかもわざわざsetConfig()
一回のためだけに変数宣言するのいやだなぁってなりますが・・・
fun main(){
setConfig(getConfig().apply{
enable = false
value = 100
})
}
はい好き。優勝です。apply
くんは.
の前(この場合getConfig()
)を引数のラムダ式のthis
に入れてくれます。
そして最後に変更されたものを返してくれます。(enable=false,value=100になったgetConfig()
)
thisは省略できるのでスッキリした見た目になりますね~
他にも仲間はいっぱいいます!
コレクション(配列)
Kotlin標準ライブラリのコレクション関連機能はひじょーに充実してます
List
配列のことです。listOf()
で生成できます。
val classes = listOf("数学Ⅱ","国語","英語","化学")
subjects[3] // "化学"
subjects[0] = "数学Ⅲ"//エラー 書き換え不可
Set
Setは同じ要素を持てません。含めようとしても自動で削除されます。
作成するにはsetOf()
です。
val numbers = setOf(1,5,3,2,5) //[1,5,3,2]
.toSet()
でListをSetに変換できます。
Map
Mapは配列のインデックスの代わりに任意のキーを使用できます。JSONみたいなかんじですね!
mapOf()
を使います。
val numbersMap = mapOf("one" to 1,"two" to 2 ,"three" to 3)
numbersMap["two"]// 2
mutable
これらのコレクションはデフォルトでは書き込み(追加、削除、変更)不可ですがmutable
とすると追加、削除、変更などができるようになります。
val classes = mutableListOf("数学Ⅱ","国語","英語","化学")
val numbers = mutableSetOf(1,5,3,2,5)
val numbersMap = mutableMapOf("one" to 1,"two" to 2 ,"three" to 3)
コレクションに使える便利なやつらを一気に紹介
val numbers = listOf(1,2,3,4,5,6,7,8,9)
//trueになるものを絞り込む
numbers.filter{it % 2 == 0}
//最初・最後の要素を取得
numbers.first()
numbers.last()
//n個の要素を除外して返す
numbers.drop(2)
numbers.dropLast(3)
//ランダムに取得
numbers.random()
//含まれているか確認
0 in numbers // false
numbers.contains(7) // true
全部書くと私が死んでしまうので一部だけ紹介しました!
ほかにもたくさんあります!
Null安全
Kotlinはnull安全な言語なので「ぬるぽ」(NullPointerException)に怯える必要はありません。
KotlinではNullを許容することを明言しない限りNullは代入出来ません。
明言するには、型の後ろに?
をつけます。
//数字かもしれないしnullかもしれん
val maybeNumber:Int? = readln().toIntOrNull()
maybeNumber+=123//エラー!! nullかもしれない
if(maybeNumber != null){
//nullで無いことが保証されInt型になる
maybeNumber+=123
println(maybeNumber)
}
nullかもしれないやつ!=null
をしてあげることによってnullでは無いことがわかるので以降コンパイラはnullが入っていないものとして処理をします。賢い!!!
安全な呼び出し
val a = "Kotlin"
val b: String? = null
println(b?.length) // nullが出力される
println(a?.length) // 6が出力されるがIntelliJには必要ないよって言われる
//このように繋げることもできる
//どこかでnullになるとnullが返される
b?.length?.times(3)
?.
でnullを考慮して安全に関数を呼び出せます。安全確認ヨシ!!
エルビス式
nullじゃないときはその値を、そうでないとき、別の値を返したいときはこれ!!
val a:Int? = null
val b:Int = a ?: -1
val c:Int = if(a != null) a else -1//同じ意味
Null安全との合わせ技
Null安全を活かした便利な関数もあります。
//空ならfirst()は無いのでnullを返す
emptyList<String>().firstOrNull()
//Intに変換不可なのでnullを返す + エルビス式でnullなら-1になる
"A".toIntOrNull() ?: -1
スコープ関数のlet
を使うと・・?
fun usefulFunc(r:Int):Double{
return r*r*PI
}
fun main(){
println("円の半径を入れてください")
val S:Double? = readln().toIntOrNull()?.let{ usefulFunc(it) }
if (S!=null){
println("円の面積は$S")
} else {
println("整数で入力してください")
}
}
?.
でtoIntOrNull()
がnullじゃないときにlet
内のusefulFunc(it)
が実行されその結果が返されます。
非nullを強制する!!
?.
に似た!!
がありますがこれはあまり使用しないことが望ましいです。
ぬるぽを愛する方、ぬるぽに会いたくなったときのみ使いましょう。
try {
val number = readln().toIntOrNull()
val sum = number!! + 123
}catch (e:NullPointerException){
println("おぬるぽ… 雅……ッ")
e.printStackTrace()
}
staticがない!?!?!?
少し語弊があるかも知れませんがKotlinにstatic(修飾子)はありません。
代わりにobject
を使います。
//パターン1
object Naotiki{
val favoriteLang="Kotlin"
}
Naotiki.favoriteLang // "Kotlin"
//パターン2
class SomeManager{
fun someFunction()=println("なんかする")
companion object{
private var instance : SomeManager?=null
fun getInstance(): SomeManager {
return instance?: SomeManager().also { instance=it }
}
}
}
SomeManager.getInstance()
classの中で使うときはcompanion object
です!!
中置関数
/*
Pairは2つの値をまとめられる
a.first
a.second のように使う
*/
val a:Pair<Int,Int> = x to y
for(i in 0 until 10){ ... }
to
やuntil
は中置関数と呼ばれるもので.
や()
を省略して呼び出せます。
宣言時には
infix fun Int.shl(x: Int): Int { ... }
5 shl 1 shl 6
のように拡張関数(またはメンバー関数)であり引数を常に一つとるようにしなければいけません
変な使い方をするとこんなものもできます。
便利な公式ライブラリなど
kotlinx.coroutines
非同期処理などを簡単に実現できます。
kotlinx.serialization
データクラスなどを簡単にJSONやその他形式にしたり、逆に戻すこともできます。
kotlinx-cli
CLIアプリケーションを容易に作れるようにします。
kotlinx-datetime
日付などを扱いやすくします。
compose-jb
Androidで使われているUIフレームワークをデスクトップアプリやWebでも使えるようにしたものです。
Kotlinで簡単にGUIアプリを作れるようになります。
おわり
紹介しきれなかったものもたくさんあり、実際につかってみないと便利さがわからないものもあります。
少しでも気になったら是非!Kotlinを始めましょう!