Quipper社 営業 Android Engineer
スタディサプリ
Quipper School
kotlin歴 7日
もしくは「Kotlinはこの先生
きのこることができるか」
dagezi
(from saikoa)
(from saikoa)
Lambdaが使えるように!!
しかも api level 7とかでも! やったぜ!!
あれ、でも Kotlin いらない子??
Java8にあったもの:
Java7:
view.setOnClickListner(new View.OnClickListner() { @Override public void onClick(VIew view) { Log.d(TAG, "clicked"); } });
Java8:
view.setOnClickListner((v) -> Log.d(TAG, "clicked"));
Kotlin:
view.setOnClickListner { Log.d(TAG, "clicked") }
Android N でも Stream, Option とかはない
一方、Kotlinの collectionライブラリ
「非効率 Naiveな実装」とは?
ラムダ式の変換を Runtime に追い出す
将来的によりいい方法に移行できる
Translation of Lambda Expressions, Brian Goetz, 2012
Java:
public static void aho(List<String> ss) { Collections.sort(ss, (s0, s1) -> s0.length() - s1.length()); Collections.sort(ss, (s0, s1) -> s0.length() + s1.length()); }
dexdump:
Class descriptor : 'LStreamTest$-void_aho_java_util_List_ss_LambdaImpl0;' Class descriptor : 'LStreamTest$-void_aho_java_util_List_ss_LambdaImpl1;'
ラムダ式ごとにクラスができてる!
基本 Naiveな実装方法
fun ttt(ls: List<String>) : Boolean = ls.any {it.startsWith("aho")}
ここで any は:
public inline fun <T> Array<out T>.all(predicate: (T) -> Boolean): Boolean { for (element in this) if (!predicate(element)) return false return true }
public static final boolean ttt(java.util.List<java.lang.String>); Code: 0: aload_0 1: ldc #9 // String ls 3: invokestatic #15 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull: (Ljava/lang/Object;Ljava/lang/String;)V 6: aload_0 7: checkcast #17 // class java/lang/Iterable 10: astore_1 11: nop 12: aload_1 13: invokeinterface #21, 1 // InterfaceMethod java/lang/Iterable.iterator: ()Ljava/util/Iterator; 18: astore_2 19: aload_2 20: invokeinterface #27, 1 // InterfaceMethod java/util/Iterator.hasNext:()Z 25: ifeq 60 28: aload_2 29: invokeinterface #31, 1 // InterfaceMethod java/util/Iterator.next: ()Ljava/lang/Object; 34: astore_3 35: aload_3 36: checkcast #33 // class java/lang/String 39: astore 4 41: aload 4 43: ldc #35 // String aho 45: iconst_0 46: iconst_2 47: invokestatic #41 // Method kotlin/text/StringsKt.startsWith$default: (Ljava/lang/String;Ljava/lang/String;ZI)Z 50: ifeq 57 53: iconst_1 54: goto 61 57: goto 19 60: iconst_0 61: ireturn
よって Kotlinは不滅
とはいうものの、Jack & Jillも進化するかも?