2016/12/18の30分 Kotlinメモ🍓

2016/12/18の30分 Kotlinメモ

書いてるコードは雑にここにあります。

github.com

スコープ関数

このQiitaがすごくよくまとまってる。

ありがたし。

qiita.com

調べる前にwithというものがあることを知り、どう使うのがいいのかなーと考えてみた。

Qiitaの記事を読んでみて、withならStringBuilderとかに使うとどうかなー?と思ってコードを書いてみた。

val strstr = with(StringBuilder()) {
    append("test")
    append("hunhun")
    toString()
}
println(strstr) // testhunhun

うーん、まあ良さ気?なのか?

とりあえずapplyletrunなどもどう使い分けるべきなのかがなんとなくだけどわかったので良かったっす!

Kotlin Night Riga

Kotlin Night Rigaの資料 2つ見てみた。

両方ともわりと初心者向けっぽい資料だった。

読んでてほとんど内容理解できたので、あーKotlin少しわかってきたのかな?という感覚を覚えたが、それはないな...🍓

jug.lv

docs.google.com

github.com

まとめ

そろそろ目的意識を持ってコード書き始めたほうがいいのかなーと思ってきた今日此の頃です

Kotlinの情報を集めるぞい! - 2016/12/17の30分 Kotlinメモ🙉

2016/12/17の30分 Kotlinメモ🙉

もっとKotlinに関する情報が欲しくなってきたので、情報源をあさってみるぞ!

Kotlin Twitter

とりあえずチェックしておくと良さそう。

twitter.com

The Daily Kotlinというのも一応みておこう。

twitter.com

Kotlin Blog

公式Blogはまず見ておいた方が良さそう。RSSとかに登録すればOKOK!

blog.jetbrains.com

Qiita Kotlin tag

QiitaのKotlin tagもRSSとかに登録しておいて気になったの見れば良さそう!

qiita.com

mediumにもKotlin tagあるので、気になる人はこっちも見ると良さそう!

medium.com

Awesome Kotlin

Kotlinに関する情報が色々あるやーつ。

libraryからKotlinに関する記事、動画まで色々まとまってる。

github.com

以下のページからawesome-kotlinにまとまってる内容をfilterできるので、めっちゃ便利!!

Kotlin is Awesome!

アドベントカレンダー

2016年はまだ途中ですが、歴代のアドベントカレンダーから得られる情報もあるよね!

qiita.com

www.adventar.org

www.adventar.org

www.adventar.org

atnd.org

Kotlin Weekly

Android Weekly的なあれですね。RSSに登録しておくよ良さそう!

us12.campaign-archive2.com

たろーさん情報

Kotlinエバンジェリストのたろーさん情報が気になるなら、とりあえずTwitter + Blog + Speakerdeckとか見るよ良さそう。

SpeakerdeckにいっぱいKotlin話があって見てると面白いぞ!

twitter.com

taro.hatenablog.jp

Presentations by Taro Nagasawa // Speaker Deck

その他

Kotlin forumがあったり、Slackがあったりするよ。

そこら辺以下にまとまってるよ!

kotlinlang.org

日本のSlackもあるよ!

Join kotlinlang-jp on Slack!

まとめ

情報源がもっと増えてくれると嬉しいぞい!

2016/12/16の30分 Kotlinメモ👌

2016/12/16の30分 Kotlinメモ👌

書いてるコードは雑にここにあります。

github.com

Kotlinスタートブック -新しいAndroidプログラミング が手元に届いたので、読み始めてる。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

Iterator

KotlinのIteratoriteratorメソッドを持つオブジェクトは、Iteratorを提供することになるらしい。

iteratorメソッドは、operator fun hasNext(): Booleanoperator fun next():Tを持つオブジェクトを返す必要がある。

何も実装なり継承なりしなくてよいと。これって要はduck typingなのかな?

class MyIterator {
    var i = 0
    operator fun hasNext(): Boolean = i++ < 5
    operator fun next(): String = "next"
}

class MyIterable {
    operator fun iterator() = MyIterator()
}

for (item in MyIterable()) {
    println(item)
}

Tail recursive functions

kotlinlang.org

再帰呼び出しの最適化の話。

KotlinはTCO(Tail Call Optimization)の仕組みがあるらしい。

末尾呼出し最適化とか言う場合もあるのかな?助けてウィキペディア先生!!

末尾再帰 - Wikipedia

再帰呼び出しってスタック積むやん、あれ最適化できるで!程度の理解でもういんじゃね?適当で。

とりあえず数値Listの合計を求める関数sumを作るとして、スタックさいならするコードが以下ですよーと。

うむ、どんどんスタック積まれていきますなー。

fun sumsum(numbers: List<Long>): Long = if (numbers.isEmpty()) 0 else numbers.first() + sum(numbers.drop(1))

sumsum((1L..10000000).toList())

んでKotlinでは「関数の最後の計算を再帰呼び出しにする」ことで、tailrec modifierが付けられると。

tailrecをつけることで、最適化されますよーってことらしい。なるほど。

んで書き直したのが以下。関数の最後がsum関数を呼び出すようになってる = 関数の最後の計算を再帰呼び出しにする になってますね。

tailrec fun sum(numbers: List<Long>, accumulator: Long = 0): Long = if (numbers.isEmpty()) accumulator else sum(numbers.drop(1), accumulator + numbers.first())

sum((1L..10000000).toList())

まとめ

Kotlin色々あるなー

2016/12/15の30分 Kotlinメモ🐘

2016/12/15の30分 Kotlinメモ🐘

書いてるコードは雑にここにあります。

github.com

引き続きCalling Kotlin from Javaを読んでる

kotlinlang.org

Static Fields

companion objectのプロパティとかconstね。

object Obj {
    const val CONST = 1

    @JvmField
    var LIST = listOf("")
}

class C {
    companion object {
        const val VERSION = 9
    }
}

const val MAX = 239

// Java
int c = Obj.CONST;
int d = SaSasSa.MAX;
int v = C.VERSION;
System.out.println(C.LIST);

Static Methods

@JvmStaticつけんとあかんで!って話。

class C {
    companion object {
        @JvmStatic fun cccccccc() {
            println("cccccccc")
        }
    }
}

// Java
C.cccccccc();

Overloads Generation

Kotlinのdefault parameter valuesがどうJavaから見えるかって話。

@JvmOverloadsをつければ、オーバーロードしてくれるって話。

つけないと引数が必ず必要になるよー

class Sample {
    @JvmOverloads fun humuhumu(i: Int = 0, s: String = "humuhumu") {
        println("i = $i,s = $s")
    }
}

// Java
Sample sample = new Sample();

sample.humuhumu();
sample.humuhumu(1);
sample.humuhumu(1, "test");

Checked Exceptions

Kotlinにはチェック例外がないんだよねー

これJavaから呼び出すときに困っちゃうわけよ

なので@Throwsをつければ、チェック例外として認識してくれるよー

Javaから呼び出されることを前提にするなら覚えておいた方が良さそう

class Sample {
    @Throws(IOException::class)
    fun okooko() {
        throw IOException()
    }
}

// Java
try {
    sample.okooko();
} catch (IOException e) {
    e.printStackTrace();
}

Null-safety

Kotlinのnon-null parameterに対してJavaからnullを渡すとRuntimeで落ちるぞ!って話

Kotlin側でnon-null parameterにnullが来ているかどうかチェックしてるからね!って話

class Sample {
    fun nullnullnull(s: String) {
        println(s)
    }

    fun nullnullnullnull(s: String?) {
        s?.let { println(it) }
    }
}

// Java
Sample sample = new Sample();

// java.lang.IllegalArgumentException: Parameter specified as non-null is null: method test.Sample.nullnullnull, parameter s
sample.nullnullnull(null); 

// OK
sample.nullnullnullnull(null);

まとめ

KotlinからJava様を意識するのそこそこ大変ですねーまったく...たのしいぜ

2016/12/14の30分 Kotlinメモ🎁

2016/12/14の30分 Kotlinメモ🎁

書いてるコードは雑にここにあります。

github.com

引き続き Calling Java code from Kotlin読んでる

kotlinlang.org

@ReadOnly@MutableJavaのCollectionをKotlin TypeのCollectionにする

昨日の夕方以下のようなことが気になってた...

JavaのCollectionは(Mutable)Collection!型になると。。。

Listなら(Mutable)List!ね。

ということは、以下のコードみたいにJavaで不変なListを作った場合に、Kotlinから見ると(Mutable)List!になるから、変更できるように見れるかー。 JavaからKotlinへ不変なListであることは伝えられない??

んで、夜に第4回 Kotlin Sansan勉強会に行くと、その答えをまさに教えてくださる救世主現る!

@RyotaMurohoshiさんが昨日その勉強会で発表した資料に答えが書いてあった。



要はCollectionを返すメソッドなりに@ReadOnly or @Mutableを付ければOKだよ!って話。

例えば昨日書いた不変なListと可変なListなら以下のように書けばいいと。

import org.jetbrains.annotations.Mutable;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.ReadOnly;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class JavaJava {

    @ReadOnly
    public List<String> getImmutableList() {
        return Collections.unmodifiableList(new ArrayList<>());
    }

    @Mutable
    public List<String> getMutableList() {
        return new ArrayList<>();
    }
}

// Kotlin
fun run() {
    val java = JavaJava()

    java.immutableList // List<String!>

    val l = java.mutableList // MutableList<String!>
    l.add("test")
    println(l) // [ test ]
}

うん、@ReadOnlyをつけたListのTypeはList<String!>になり、@MutableをつけたListのTypeはMutableList<String!>になってると。

うむ、うむ、うむ、よい☺

というか対応してるannotationsのKotlin compiler source code見たらちゃんと書いてあった。

github.com

val READ_ONLY_ANNOTATIONS = listOf(
        JvmAnnotationNames.JETBRAINS_READONLY_ANNOTATION
)

val MUTABLE_ANNOTATIONS = listOf(
        JvmAnnotationNames.JETBRAINS_MUTABLE_ANNOTATION
)

Calling Kotlin from Java

kotlinlang.org

はい、じゃ次はKotlinのコードをJavaで見るとどうなるのって話を見てみる。

Package-Level Functions

クラスとTop Levelの関数がどう見えるのかって話かな。

package test

class Sample {
}

fun test() {
}

// Java
public class CallingKotlinFromJavaSample {

    public static void run() {
        Sample sample = new Sample();
        SampleKt.test();
    }
}

Javaから参照する時の名前を指定できるらしい。マジかよ

@file:JvmName("SaSasSa") // Javaからみた場合にどういうクラス名にするかを決められる

package test

class Sample {
}

fun test() {
}


// Java
import test.SaSasSa;
import test.Sample;

public class CallingKotlinFromJavaSample {

    public static void run() {
        Sample sample = new Sample();
        SaSasSa.test();
    }
}

Instance Fields

KotlinのpropertyをJavaのInstance Fieldsととして見えるようにする方法かなー?

@file:JvmName("SaSasSa")

package test

class Sample {
    @JvmField val id = 0 // propertyをJavaのInstance Fieldsととして見えるようにする
}

fun test() {
}


// Java
import test.SaSasSa;
import test.Sample;

public class CallingKotlinFromJavaSample {

    public static void run() {
        Sample sample = new Sample();
        System.out.println(sample.id);
    }
}

まとめ

Kotlinの知見もっとほしいぞー🎁