2016/12/18の30分 Kotlinメモ🍓
2016/12/18の30分 Kotlinメモ
書いてるコードは雑にここにあります。
スコープ関数
このQiitaがすごくよくまとまってる。
ありがたし。
調べる前にwith
というものがあることを知り、どう使うのがいいのかなーと考えてみた。
Qiitaの記事を読んでみて、with
ならStringBuilder
とかに使うとどうかなー?と思ってコードを書いてみた。
val strstr = with(StringBuilder()) { append("test") append("hunhun") toString() } println(strstr) // testhunhun
うーん、まあ良さ気?なのか?
とりあえずapply
やlet
やrun
などもどう使い分けるべきなのかがなんとなくだけどわかったので良かったっす!
Kotlin Night Riga
Kotlin Night Rigaの資料 2つ見てみた。
両方ともわりと初心者向けっぽい資料だった。
読んでてほとんど内容理解できたので、あーKotlin少しわかってきたのかな?という感覚を覚えたが、それはないな...🍓
まとめ
そろそろ目的意識を持ってコード書き始めたほうがいいのかなーと思ってきた今日此の頃です
Kotlinの情報を集めるぞい! - 2016/12/17の30分 Kotlinメモ🙉
2016/12/17の30分 Kotlinメモ🙉
もっとKotlinに関する情報が欲しくなってきたので、情報源をあさってみるぞ!
Kotlin Twitter
とりあえずチェックしておくと良さそう。
The Daily Kotlinというのも一応みておこう。
Kotlin Blog
公式Blogはまず見ておいた方が良さそう。RSSとかに登録すればOKOK!
Qiita Kotlin tag
QiitaのKotlin tagもRSSとかに登録しておいて気になったの見れば良さそう!
mediumにもKotlin tagあるので、気になる人はこっちも見ると良さそう!
Awesome Kotlin
Kotlinに関する情報が色々あるやーつ。
libraryからKotlinに関する記事、動画まで色々まとまってる。
以下のページからawesome-kotlinにまとまってる内容をfilterできるので、めっちゃ便利!!
アドベントカレンダー
2016年はまだ途中ですが、歴代のアドベントカレンダーから得られる情報もあるよね!
Kotlin Weekly
Android Weekly的なあれですね。RSSに登録しておくよ良さそう!
たろーさん情報
Kotlinエバンジェリストのたろーさん情報が気になるなら、とりあえずTwitter + Blog + Speakerdeckとか見るよ良さそう。
SpeakerdeckにいっぱいKotlin話があって見てると面白いぞ!
Presentations by Taro Nagasawa // Speaker Deck
その他
Kotlin forumがあったり、Slackがあったりするよ。
そこら辺以下にまとまってるよ!
日本のSlackもあるよ!
まとめ
情報源がもっと増えてくれると嬉しいぞい!
2016/12/16の30分 Kotlinメモ👌
2016/12/16の30分 Kotlinメモ👌
書いてるコードは雑にここにあります。
Kotlinスタートブック -新しいAndroidプログラミング が手元に届いたので、読み始めてる。
Kotlinスタートブック -新しいAndroidプログラミング
- 作者: 長澤太郎
- 出版社/メーカー: リックテレコム
- 発売日: 2016/07/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Iterator
KotlinのIteratorはiterator
メソッドを持つオブジェクトは、Iteratorを提供することになるらしい。
iterator
メソッドは、operator fun hasNext(): Boolean
とoperator 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
再帰呼び出しの最適化の話。
KotlinはTCO(Tail Call Optimization)の仕組みがあるらしい。
末尾呼出し最適化とか言う場合もあるのかな?助けてウィキペディア先生!!
再帰呼び出しってスタック積むやん、あれ最適化できるで!程度の理解でもういんじゃね?適当で。
とりあえず数値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メモ🐘
書いてるコードは雑にここにあります。
引き続きCalling Kotlin from Javaを読んでる
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メモ🎁
書いてるコードは雑にここにあります。
引き続き Calling Java code from Kotlin読んでる
@ReadOnly
と@Mutable
でJavaの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見たらちゃんと書いてあった。
val READ_ONLY_ANNOTATIONS = listOf( JvmAnnotationNames.JETBRAINS_READONLY_ANNOTATION ) val MUTABLE_ANNOTATIONS = listOf( JvmAnnotationNames.JETBRAINS_MUTABLE_ANNOTATION )
Calling Kotlin from Java
はい、じゃ次は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の知見もっとほしいぞー🎁