kotlin の Map の forEach を古い Android で使う
forEach の書き方によって古い Android 端末(KitKat)でエラーが出たので、対処のメモです。
括弧「()」が重要
以下の様なコードを書くと、実行されるコードは Java8 の Map になり、APIレベルの24からのサポートになるそうです。fun hoge(map: Map<String, Long>) { map.forEach { key, value -> Log.d("HOGE", "key: $key -> value: $value") } }APIレベル19でも動かすためには、次のように記述します。
fun hoge(map: Map<String, Long>) { map.forEach { (key, value) -> Log.d("HOGE", "key: $key -> value: $value") } }ラムダ式のところを括弧「()」でくるんでいるところがミソで、2引数ではなく1引数にします。 これによりAPIレベル19でもサポートしているバイトコードになるみたいです。 詳細は、下記の stackoverflow の記事を参照ください。 ちなみに、私の場合、発生した例外は
java.lang.NoClassDefFoundError
で、場所は forEach のラムダ式の箇所 ExternalSyntheticLambda6
でした。