2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

高専生に贈るKotlin入門【布教編】

Posted at

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){ ... }

tountil中置関数と呼ばれるもので.()を省略して呼び出せます。
宣言時には

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を始めましょう!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?