@kotlin_lang

Страница 609 из 982
Siarhei
28.03.2018
14:05:52
data class NetworkGUID(val value: Int) { fun isStatic(): Boolean = value and 1 == 0 fun isDefault(): Boolean = value == 1 } typealias NetworkGUID = Int fun NetworkGUID.isValid(): Boolean = this > 0 fun NetworkGUID.isStatic(): Boolean = this and 1 == 0 ну и чтобы код не пришлось совсем править нигде fun NetworkGUID(v: Int) = v

собственно я про моё применение typealias на практике, и в примере считай что inline class из 1.3 :)

Siarhei
28.03.2018
14:12:09
расшифруй пожалуйста, или ссылку на статью годную

Google
Siarhei
28.03.2018
14:12:21
потому что у меня только с Eclipse ADT ассоциации )

Andrew
28.03.2018
14:14:24
data class NetworkGUID(val value: Int) { fun isStatic(): Boolean = value and 1 == 0 fun isDefault(): Boolean = value == 1 } typealias NetworkGUID = Int fun NetworkGUID.isValid(): Boolean = this > 0 fun NetworkGUID.isStatic(): Boolean = this and 1 == 0 ну и чтобы код не пришлось совсем править нигде fun NetworkGUID(v: Int) = v
typealias Announcer = String fun Announcer.announce() = println("$this") fun main(args: Array<String>) { "Hello, world!".announce() } В консоли "Hello, world!" вместо ошибки компиляции. Так что без инлайн-классов не обойтись.

Alexey
28.03.2018
14:15:39
расшифруй пожалуйста, или ссылку на статью годную
Algebraic data type - в котлине это sealed class + реализации

http://engineering.pivotal.io/post/algebraic-data-types-in-kotlin/

dobrowins
28.03.2018
14:24:19
Пока писал сюда вопрос — понял в чем проблема. Хорошо, что вы есть, ребят!

Anton
28.03.2018
14:24:36
не благодари

Siarhei
28.03.2018
14:27:31
так первый вариант лучше
но не быстрее, + вопрос комфорта

т.е. для разработчика в итоге ни строчки не изменилось

http://engineering.pivotal.io/post/algebraic-data-types-in-kotlin/
тут нужен пример, если можно даже мой переделать случай, непонятно

Даниил
28.03.2018
14:29:02
т.е. для разработчика в итоге ни строчки не изменилось
результат для разработчика кокрастыке разный

Siarhei
28.03.2018
14:29:13
ни строчки кода не изменилось

кроме объявления класса

Google
Siarhei
28.03.2018
14:29:28
как ускорить код? я вижу максимально быстрое решение малой кровью через typealias

для нетворкинга огромные оверхеды на создание ненужных объектов

Даниил
28.03.2018
14:30:03
ни строчки кода не изменилось
а теперь попробуй передать целое число туда где требуется NetworkGUID

Александр
28.03.2018
14:30:05
>кокрастыке Ого слово какое, это тоже тайпалиас?

Александр
28.03.2018
14:30:27
Ну этот не знаю :(

Даниил
28.03.2018
14:30:46
Ну этот не знаю :(
ну это с какого-то из скринов с одноклассников

Alexey
28.03.2018
14:32:46
тут нужен пример, если можно даже мой переделать случай, непонятно
А балин, не внимательно прочитал, сюда ADT не пристроить

Siarhei
28.03.2018
14:34:45
и увидишь что изменилось
ну в ногу стрелять не отменяли

Даниил
28.03.2018
14:36:56
ну в ногу стрелять не отменяли
ну вот для этого и нужны инлайн классы, шоб было типобезопасно но без оверхеда алиасы — не типобезопасно

Siarhei
28.03.2018
14:56:33
ну я пример для 1.2 привел, не вижу альтернатив других

будет 1.3, заменим красивше )

Alexey
28.03.2018
15:04:47
Даниил
28.03.2018
15:05:12
Да к сожалению компилятор их не считает отдельными типами
не, ну как «к сожалению» цели просто разные)

иногда действительно достаточно просто алиаса

Mikhail
28.03.2018
15:07:47
интересно, почему алиасы сразу запилили а inline class'ы еще до сих пор нет

Alexey
28.03.2018
15:09:54
интересно, почему алиасы сразу запилили а inline class'ы еще до сих пор нет
Потому что алиасы просто стираются, а инлайн классы нет

Тимур
28.03.2018
17:16:22
интересно, почему алиасы сразу запилили а inline class'ы еще до сих пор нет
могу предположить, потому что алиасы важнее для написания кроссплатформенного кода сделали typealias ArrayList<E> = java.util.ArrayList<E> юзьвери радостно везде заюзали котлиновский ArrayList, который всего лишь алиасит в жабу потом поменяли платформу, и там уже своя реализация ArrayList но коду который использует его пофиг, компиляй его хоть там, хоть там, ничего менять не надо а инлайн классы - это всего лишь оптимизация, без нее можно обойтись

Google
olzhas
28.03.2018
17:20:34
abstract class Parent class Child1:Parent() class Child2:Parent() // ... class ChildN:Parent() class Process() { val childs1 = mutableListOf<Child1>() val childs2 = mutableListOf<Child2>() // ... val childsN = mutableListOf<ChildN>() fun process(parents:List<Parent>) { for (parent in parents) { when (parent) { is Child1 -> childs1+=parent is Child2 -> childs2+=parent // ... is ChildN -> childsN+=parent } } } }

Вот есть у меня такой код.

Куча повторений.

Как это все можно сократить. Вроде как можно использовать map, но не могу сообразить как

Тимур
28.03.2018
17:27:56
fun <T : Parent> process(list: List<T>) { ... }

olzhas
28.03.2018
17:30:33
У меня в List<Parent> могут лежать разные типы.

Тимур
28.03.2018
17:51:58
inline fun <reified T : Parent> listOfChildren(list: List<Parent>) = list.mapNotNull { it as? T } val children1 = listOfChildren<Child1>(parents) val children2 = listOfChildren<Child2>(parents) // ... val childrenN = listOfChildren<ChildN>(parents)

Andrew
28.03.2018
17:53:07


Andrew
28.03.2018
18:03:30
inline fun <reified T : Parent> listOfChildren(list: List<Parent>) = list.mapNotNull { it as? T } val children1 = listOfChildren<Child1>(parents) val children2 = listOfChildren<Child2>(parents) // ... val childrenN = listOfChildren<ChildN>(parents)
Там есть filterIsInstance, который сделает то же самое, но без null-ов в результирующих списках: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/filter-is-instance.html

Alexandr
28.03.2018
18:04:57
Я не совсем понимаю как это поможет мне уменьшить количество кода.
Он как бы намекает тебе, что ты можешь отказать от своей портянки кода заменив ее на filterIs с inlineом типа

Andrew
28.03.2018
18:05:00
Я не совсем понимаю как это поможет мне уменьшить количество кода.
Это поможет вам перечислять два раза все ваши типы-наследники не два раза (сначала при объявлении списка, потом при фильтрации), а один.

olzhas
28.03.2018
18:14:49
Что то типа такого?

class Process() { val parents = mutableListOf<Parent>() val children1:List<Child1> = parents.filterIsInstance(Child1::class.java) val children2:List<Child2> = parents.filterIsInstance(Child2::class.java) // ... val childrenN:List<ChildN> = parents.filterIsInstance(ChildN::class.java) fun process(parents:List<Parent>) { this.parents += parents } }

Andrew
28.03.2018
18:16:44
А рассыпание по спискам у вас не при инициализации класса происходит?

olzhas
28.03.2018
18:18:08
нет. На самом деле там сложнее структура, плюс там еще и RxJava. Но вашу идею я понял. Теперь думаю как ее прикрутить.

а в примере выше надо get добавить

val children1:List<Child1> get() = parents.filterIsInstance(Child1::class.java)

тогда будет все норм.

Google
Andrew
28.03.2018
18:19:18
С оговоркой, что фильтрация будет при каждом обращении к children* происходить заново.

olzhas
28.03.2018
18:20:41
да. это тоже верно.

Andrew
28.03.2018
18:25:50
Если этого хочется избежать, то это уже не вариант. Можно, конечно, завести наряду с children* ещё одно чудовищное private val lists: MutableMap<KClass, List<in Parent>>, при создании списки укладывать в него (val chilrden5: List<Child5> = mutableListOf<Child5>().also { lists[Child5::class] = it }) и в process() сделать чёт вроде parent.forEach { child -> lists.get(child::class)?.let { it += child } }, но это решение уже плоховато пахнет и стоит хорошо подумать, прежде чем его применять, по мне. (писал прям тут, так что за работоспособность as is не ручаюсь)

Тимур
28.03.2018
18:26:01
можно еще немножко сэкономить, не указывая тип: List<Child1> он сам выведется

Andrew
28.03.2018
18:27:07
можно еще немножко сэкономить, не указывая тип: List<Child1> он сам выведется
Сам выведется MutableMap, что может быть нежелательно.

А вообще делегату Lazy хотелось бы ещё добавить метод reset, сам уже один раз натыкался на случай, где это пригодилось бы.

olzhas
28.03.2018
18:35:20
KClass это уже котлиновская рефлексия?

Это вроде как дополнительно подключать надо?

Andrew
28.03.2018
18:36:57
Нет, сам KClass доступен без полноценной рефлексии.

olzhas
28.03.2018
18:39:24
Спасибо, ваши советы мне помогли.

Жабра
28.03.2018
18:45:32
Щас начал тыкать стримы из Джавы... А есть ли профит их юзать, если пишешь на котлине? И если да, то какой?

Quantum Harmonizer
28.03.2018
18:49:34
Щас начал тыкать стримы из Джавы... А есть ли профит их юзать, если пишешь на котлине? И если да, то какой?
Профит стримов перед сиквенсами — возможность параллельного выполнения.

Sergey
28.03.2018
18:50:34
Quantum Harmonizer
28.03.2018
18:51:21
Sergey
28.03.2018
18:51:31
так есть на это тикет даже

Quantum Harmonizer
28.03.2018
18:52:04
(я, кстати, за то, чтобы можно было подключить стдлиб без сиквенсов)

Igor
28.03.2018
19:22:24
Профит стримов перед сиквенсами — возможность параллельного выполнения.
У них очень узкий юзкейз. На маленьких данных - оверхед, на больших данных… зачем это делать на джаве

Александр
29.03.2018
00:47:10
Всем привет, кто-то применял kotlin в автоматизации тестирования, поделитесь опытом пожалуйста

Ivan
29.03.2018
01:38:36
Александр
29.03.2018
01:41:16
В частности мобильная(Android) и web

Google
Ivan
29.03.2018
01:43:47
В частности мобильная(Android) и web
В плане web не подскажу, а мобилки тестить довольно удобно, можно предоставить набор готовых page object'ов + dsl чтобы qa могли сами писать тесты

Либо чтобы разработчикам было удобно

Что-то разнесло телеграм



с десктопа одно из сообщений не видно

Kirill
29.03.2018
06:09:13
В частности мобильная(Android) и web
С вебом есть пара самописных костылей - https://github.com/saksmt/ktest

Albert
29.03.2018
06:27:48
Господа. Вопрос. Есть ли в котлине возможность чтения джавового поля напрямую без геттера.

Жабра
29.03.2018
06:33:51
Вроде как @JvmField val field = ...

Albert
29.03.2018
06:36:27
Вроде как @JvmField val field = ...
О, точно. Спасибо)

Boris
29.03.2018
07:56:44
Спасибо, ваши советы мне помогли.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/group-by.html

Vladislav
29.03.2018
11:33:06
Всем привет, хотелось поделиться такой вот странностью, вчера обнаружил, что getOrPut котлиновская extension function, _немного_ отличается от computeIfAbsent для ConcurrentHashMap он *не thread-safe*, то есть функция может выполниться более одного раза для одного и того же ключа.

Страница 609 из 982