Size: a a a

2019 November 26

N

Nick in Kotlin JVM
Vladimir Petrakovich
flatMap + listOf выглядит немного неэффективным
почему?
источник

N

Nick in Kotlin JVM
лишняя аллокация списка?
хм
можно через reduce?
источник

VP

Vladimir Petrakovich in Kotlin JVM
Nick
почему?
Создание двух списков, без которого можно было бы обойтись
источник

N

Nick in Kotlin JVM
в принципе да, можно через reduce
источник

VP

Vladimir Petrakovich in Kotlin JVM
Вот это
mutableList<Type>.apply {
  add(a)
  add(b)
  addAll(someList.flatMap { listOf(it.c, it.d) }
}
Можно переписать на
mutableList<Type>.apply {
  add(a)
  add(b)
  for (item in someList) {
     addAll(item.c)
     addAll(item.d)
  }
}
И это, скорее всего, даст эффект, сравнимый с теми доработками компилятора.
источник

VP

Vladimir Petrakovich in Kotlin JVM
Nick
нет, но во время первого открытия экрана вполне себе сжирало
там просто экран андроид аппки был
Список должен быть большим, чтобы это было заметно
источник

N

Nick in Kotlin JVM
Vladimir Petrakovich
Вот это
mutableList<Type>.apply {
  add(a)
  add(b)
  addAll(someList.flatMap { listOf(it.c, it.d) }
}
Можно переписать на
mutableList<Type>.apply {
  add(a)
  add(b)
  for (item in someList) {
     addAll(item.c)
     addAll(item.d)
  }
}
И это, скорее всего, даст эффект, сравнимый с теми доработками компилятора.
так и писалось, просто там еще доп проверка на пустоту было, функционально, но да, это лучший вариант
источник

VA

Victor Alenkov in Kotlin JVM
кстати, про addAll
А после компиляции одинаково пашут эти вариации?
1) mutableList + my2List
2) mutableList.addAll(my2List)
источник

VP

Vladimir Petrakovich in Kotlin JVM
Кстати, бенчмарки на JMH не очень полезны на андроиде - всё-таки совсем другой рантайм
источник

VP

Vladimir Petrakovich in Kotlin JVM
Victor Alenkov
кстати, про addAll
А после компиляции одинаково пашут эти вариации?
1) mutableList + my2List
2) mutableList.addAll(my2List)
Нет, + создаёт новый список
Вот это - аналог addAll:
mutableList += my2List
источник

N

Nick in Kotlin JVM
к сожалению, += имеет тип ретурна Unit и соответственно чейнинг им не сделаешь
источник

N

Nick in Kotlin JVM
а + для MutableCollection не был оверрайднут, поэтому юзается Collection.plus со всеми вытекающими
источник

VP

Vladimir Petrakovich in Kotlin JVM
Чейнинг не так уж нужен на котлине
источник

VP

Vladimir Petrakovich in Kotlin JVM
Nick
а + для MutableCollection не был оверрайднут, поэтому юзается Collection.plus со всеми вытекающими
Было бы очень плохо, если бы + модифицировал аргумент
источник

e

expert in Kotlin JVM
Ребята, а Вы не могли бы подсказать, почему bimap не становится default interface method ? У меня прописан ""-jvm-target 1.8""

Оно создаёт этот метод в static class интерфейса.

interface ByteArrayMarshaller<T> {
   fun encode(value: T): ByteArray
   fun decode(value: ByteArray): T

   fun <V>bimap(tv: (T) -> V, vt: (V) -> T): ByteArrayMarshaller<V> = object : ByteArrayMarshaller<V> {
       override fun encode(value: V): ByteArray {
           return encode(vt(value))
       }

       override fun decode(value: ByteArray): V {
           return tv(decode(value))
       }
   }
}
источник

VP

Vladimir Petrakovich in Kotlin JVM
expert
Ребята, а Вы не могли бы подсказать, почему bimap не становится default interface method ? У меня прописан ""-jvm-target 1.8""

Оно создаёт этот метод в static class интерфейса.

interface ByteArrayMarshaller<T> {
   fun encode(value: T): ByteArray
   fun decode(value: ByteArray): T

   fun <V>bimap(tv: (T) -> V, vt: (V) -> T): ByteArrayMarshaller<V> = object : ByteArrayMarshaller<V> {
       override fun encode(value: V): ByteArray {
           return encode(vt(value))
       }

       override fun decode(value: ByteArray): V {
           return tv(decode(value))
       }
   }
}
@JvmDefault вам в помощь
источник

e

expert in Kotlin JVM
Vladimir Petrakovich
@JvmDefault вам в помощь
Помогло, спасибо. Я думал только -Xjvm-default=enable достаточно, поэтому не работало.
источник

VP

Vladimir Petrakovich in Kotlin JVM
expert
Помогло, спасибо. Я думал только -Xjvm-default=enable достаточно, поэтому не работало.
Странно, что там нет чего-то в духе -Xjvm-default=always, но что есть, то есть 🤷‍♂️
источник

BP

Bogdan Panchenko in Kotlin JVM
Vladislav Navrocky
Ну у меня уже в трех местах версия, уже начинает смущать
если это подмодули почему в главном модуле не прописать
источник

VA

Victor Alenkov in Kotlin JVM
Vladislav Navrocky
там тоже подстановки не работют
правда? как же тогда у меня в buildSrc/build.gradle.kts это пашет?

val kotlinVersion = "1.3.+"

dependencies {
   implementation(kotlin("gradle-plugin", kotlinVersion))

   implementation("org.springframework.boot:spring-boot-gradle-plugin:+")
}
источник