
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 :)

Alexey
28.03.2018
14:11:16

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

Google

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

Andrew
28.03.2018
14:14:24

Alexey
28.03.2018
14:15:39
http://engineering.pivotal.io/post/algebraic-data-types-in-kotlin/

Даниил
28.03.2018
14:22:02

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

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

Siarhei
28.03.2018
14:27:31
т.е. для разработчика в итоге ни строчки не изменилось

Даниил
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

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

Даниил
28.03.2018
14:30:10

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

Даниил
28.03.2018
14:30:46

Alexey
28.03.2018
14:32:46

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

Sergey
28.03.2018
17:01:53

Тимур
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

olzhas
28.03.2018
18:00:28

Andrew
28.03.2018
18:03:30

Alexandr
28.03.2018
18:04:57

Andrew
28.03.2018
18:05:00

Тимур
28.03.2018
18:07:12

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
А вообще делегату 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

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

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

Albert
29.03.2018
06:36:27

Boris
29.03.2018
07:56:44

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