Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Kotlin勉強会 in ehime

645 views

Published on

Kotlin勉強会 in ehime

Published in: Engineering
  • Login to see the comments

Kotlin勉強会 in ehime

  1. 1. Kotlin勉強会 in Ehime GDG四国 @bornknow108
  2. 2. 目次 ・Kotlin とは ・基本文法 ・配列、コレクション ・SAM変換 ・TypeAlias、Extension、スコープ関数 ・Java混在で開発する時 ・さいごに
  3. 3. Kotlin とは Kotlin - Wikipedia https://ja.wikipedia.org/wiki/Kotlin JetBrains社(チェコ)の研究開発拠点(ロシア)で生ま れた言語。 Android Studio 3.0 からフルサポートされる。 最新バージョンは 1.1.3。(2017/7/1 現在)
  4. 4. 基本文法(Javaとの違い) ・Null セーフティです。 ・プリミティブ型(基本データ型)はありません。 ・new は不要です。 ・引数にデフォルト値が設定できます。 ・セミコロンは不要です。 ・三項演算子はありません。 etc ….
  5. 5. 基本文法(Null セーフティです。) // コンパイルエラー var notNullableVariable: String = null // OK var nullableVariable: String? = null // OK String notNullableVariable = null; // OK String nullableVariable = null; Kotlin Java
  6. 6. 基本文法(Null セーフティです。) var notNullableVariable: String = "" notNullableVariable.isEmpty() // return true var nullableVariable: String? = null nullableVariable.isEmpty() // コンパイルエラー nullableVariable?.isEmpty() // return null nullableVariable?.isEmpty() ?: false // return false nullableVariable = "" nullableVariable!!.isEmpty() // return true Kotlin String nullableVariable = null; nullableVariable.isEmpty(); // NullPointerException if (nullableVariable != null) { return nullableVariable.isEmpty(); } return null; // return null if (nullableVariable != null) { return nullableVariable.isEmpty(); } return false; // return false Java
  7. 7. 基本文法(プリミティブ型(基本データ型)はありません。 ) var intVariable: Int = 0 var floatVariable: Float = 0f var doubleVariable: Double = 0.0 var longVariable: Long = 0L var shortVariable: Short = 0 var byteVariable: Byte = 0 var booleanVariable: Boolean = false // 型推論を使う場合 var intVariable = 0 var floatVariable = 0f var doubleVariable = 0.0 var longVariable = 0L var booleanVariable = false int intVariable = 0; float floatVariable = 0; double doubleVariable = 0; long longVariable = 0; short shortVariable = 0; byte byteVariable = 0; boolean booleanVariable = false; Kotlin Java
  8. 8. 基本文法(new は不要です。) val intent = Intent() Intent intent = new Intent(); Kotlin Java
  9. 9. 基本文法(引数にデフォルト値が設定できます。 ) class ClassA { public void methodA() { methodA("a", "b", "c"); } public void methodA(String arg1) { methodA(arg1, "b", "c"); } public void methodA(String arg1, String arg2) { methodA(arg1, arg2, "c"); } public void methodA(String arg1, String arg2, String arg3) { System.out.println(arg1 + " " + arg2 + " " + arg3); } public void methodA2(String arg2) { System.out.println("a" + " " + arg2 + " " + "c"); } public void main() { methodA(); // a b c methodA("d"); // d b c methodA("d", "e"); // d e c methodA("d", "e", "f"); // d e f methodA2("g"); // a g c } } Kotlin Java class ClassA { fun methodA(arg1: String = "a", arg2: String = "b", arg3: String = "c"){ print("${arg1} ${arg2} ${arg3}") } fun main() { methodA() // a b c methodA("d") // d b c methodA("d", "e") // d e c methodA("d", "e", "f") // d e f methodA(arg2 = "g") // a g c } } }
  10. 10. 基本文法(引数にデフォルト値が設定できます。 ) class ClassA { private String arg1 = ""; public ClassA() { this("a"); } public ClassA(String arg1) { this.arg1 = arg1; } public String getArg1() { return arg1; } public void setArg1(String arg1) { this.arg1 = arg1; } } Kotlin Java class ClassA(var arg1: String = "a") class ClassA(arg1: String = "a") { var arg1 = arg1 } class ClassA(arg1: String = "a") { var arg1 = arg1 set(value) { field = value } get() { return arg1 } }
  11. 11. 基本文法(三項演算子はありません。 ) fun test(a: Int): Int { return if (a >= 1) { 100 } else { 999 } } public int test(int a) { return a >= 1 ? 100 : 999; } Kotlin Java
  12. 12. 配列、コレクション ・読み取り専用なコレクションと書き込み可能なコレクションがわか れています。 ・Java8 の Stream API が Kotlin のコレクションに組み込まれて います。
  13. 13. val array = arrayOf(1, 2, 3) val intArray = intArrayOf(1, 2, 3) // floatArrayOf, charArrayOf, booleanArrayOf etc... val blankArray: Array<Int?> = arrayOfNulls(10) // nullのから配列:要素数10個 val list = listOf("a", "b", "c") // List<String> val mutableList = mutableListOf("a", "b", "c") // ArrayList<String> val map = mapOf("a" to 1, "b" to 2, "c" to 3) // Map<K, V> val map2 = mapOf<String, Int>("a" to 1, "b" to 2, "c" to 3) val mutableMap = mutableMapOf("a" to 1, "b" to 2, "c" to 3) val set = setOf(1, 2, 3) val mutableSet = mutableSetOf(1, 2, 3) 配列、コレクション(関数をつかった宣言方法 ) Kotlin
  14. 14. 配列、コレクション(Stream API相当の実装) val array = listOf("aaaa", "bbbb", "cccc") val count = array.filter { it == "aaaa" }.count() ArrayList<String> array = new ArrayList<>(); array.add("aaaa"); array.add("bbbb"); array.add("cccc"); Long count = array.stream() .filter(s -> s.equals("aaaa")).count(); Kotlin Java
  15. 15. SAM変換 ・Single Abstract Method 変換 ・Java で定義した interfaceにしかSAM 変換は、適用できませ ん。 ・Kotlin で定義した interface に SAM 変換は効きません。
  16. 16. SAM変換 view.setOnClickListener { Log.d("debug", "onClick") } view.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Log.d("debug", "onClick") } }); // Java8 Lambda view.setOnClickListener(v -> { Log.d("debug", "onClick") }); Kotlin Java
  17. 17. SAM変換 Kotlin interface OnClickListener { fun onClick(view: View) } // compile error // val listener: OnClickListener = { // Log.d("debug", "onCick") // } val listener: OnClickListener = object: OnClickListener { override fun onClick(view: View) { Log.d("debug", "onCick") } }
  18. 18. class Test { var onClickListener: ((view: View) -> Unit)? = { view -> Log.d("debug", "onClick") } fun test() { onClickListener?.invoke(View(context)) } } SAM変換 Kotlin
  19. 19. TypeAlias、Extension、スコープ関数 ・TypeAliasは、既存の型や関数リテラル(匿名関数/無名関数)に 別名をつけるための機能です。 ・Extension(= 拡張関数)は、継承無しでクラスを拡張するための 機能です。
  20. 20. TypeAlias、Extension、スコープ関数(型の別名) Kotlin typealias Centimeter = Int typealias Kilogram = Int class Man { var height: Centimeter = 0 var weight: Kilogram = 0 }
  21. 21. TypeAlias、Extension、スコープ関数(関数の別名) Kotlin var onClickListener: ((view: View) -> Unit)? = { view -> Log.d("debug", "onClick") } fun test() { onClickListener?.invoke(View(context)) } typealias OnClickListener = (view: View) -> Unit val listener: OnClickListener = { view -> Log.d("debug", "onClick") } fun test() { listener.invoke(View(context)) }
  22. 22. TypeAlias、Extension、スコープ関数(Extension) Kotlin fun Date.formatShort(): String { val formatString = “m月d日” return SimpleDateFormat(formatString, Locale.getDefault()).format(this) } fun Date.formatLong(): String { val formatString = “y年m月d日” return SimpleDateFormat(formatString, Locale.getDefault()).format(this) } Date().formatShort() // 7月1日
  23. 23. TypeAlias、Extension、スコープ関数(apply) Kotlin val webview = WebView(context).apply { settings.apply { javaScriptEnabled = true setGeolocationEnabled(true) setSupportZoom(true) useWideViewPort = true } } ・apply は渡されたレシーバーを返します
  24. 24. TypeAlias、Extension、スコープ関数(let) Kotlin val doubleLength = text?.let { it.length * 2 } ?: 0 ・let は実行された関数の結果を返します ・あと、with とか also とかがありますが、使いみちが わかってないです。
  25. 25. Java混在で開発する時 ・Kotlin の実装を Java で呼び出すときは、Annotation を使いま しょう。 ・Java の実装を Kotlin で呼び出すときは、省略表記活用しましょ う。 ・Android で Annotation を活用する Java のライブラリ(Dagger2 とか Databinding) 使うなら Kapt を有効にしましょう
  26. 26. Java混在で開発する時(java から呼び出す) class ClassA { var hoge: String = "" @JvmOverloads fun bar(arg0: String = "", arg1: Int = 0, arg2: Int = 0) { //NOP } companion object { @JvmField var foo: String = "" @JvmStatic fun test() { //NOP } } } ClassA classA = new ClassA(); // メンバはこう見えます String hoge = classA.getHoge(); classA.setHoge(hoge); // JvmOverloadsはこう見えます classA.bar(); classA.bar("a"); classA.bar("a", 2); classA.bar("a", 2, 3); // JvmFieldはこう見えます String foo = ClassA.foo; // JvmStaticはこう見えます ClassA.test(); ClassA.Companion.test(); Kotlin Java
  27. 27. public class ClassB { private String mFoo = ""; public void setFoo(String value) { mFoo = value; } public String getFoo() { return mFoo; } } val classB = ClassB() classB.foo = "test" print(classB.foo) Java混在で開発する時(kotlin から呼び出す) Kotlin Java
  28. 28. さいごに Kotlin入門までの助走読本 https://drive.google.com/file/d/0Bylpznm149-gTG RjOFRkWm9PODg/view Try Kotlin https://try.kotlinlang.org/

×