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も進化するかも?