@kotlin_lang

Страница 810 из 982
Ivan
15.08.2018
08:36:45
Можно ли как-то встроенными функциями в строке "14-17" оставить только 17 или самое простое решение str.substring(str.indexOf("-") + 1)?

Sergey
15.08.2018
08:37:39
"14-17".split("-")[1] :D

Руслан
15.08.2018
08:38:12
x.substringAfter("-")

Google
Ivan
15.08.2018
08:40:31
x.substringAfter("-")
Воот, спасибо, лучше всего подходит

Dimon
15.08.2018
09:06:30
Народ, смотрели исходники беззнаковой арифметики?

import java.math.BigInteger // In lieu of tricky code, for now just use long arithmetic.

Так что обрабатывать большие объёмы данных с её помощью я б пока не советовал

Alexander
15.08.2018
09:35:04
А какое отношение BigInteger имеет к большим объемам данных?

У вас количество записей в базе данных в long не помещается?

Dimon
15.08.2018
09:52:33
нет, я не про количество данных в БД, я об обработке аудио в реальном времени, где UShort пришёлся бы очень кстати

Но создавать объект BigInteger для каждого второго байта это оверкилл

конечно можно было бы рендер-скрипт подключить, но зависит от поставленной задачи

Andrew
15.08.2018
10:44:28
import java.math.BigInteger // In lieu of tricky code, for now just use long arithmetic.
Если ты о https://github.com/kotlin-graphics/kotlin-unsigned, оно к новоиспечённым родным unsigned в котлине отношения не имеет.

Dimon
15.08.2018
10:45:06
других реализаций я не нашёл

или код майлстоуна 1.3 не опубликован?

Andrew
15.08.2018
10:46:12
других реализаций я не нашёл
https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/unsigned/src/kotlin/UShort.kt

Google
Andrew
15.08.2018
10:46:30
(ну и всё остальное в округе)

Dimon
15.08.2018
10:47:57
О, пасиб

Andrew
15.08.2018
10:49:01
https://github.com/Kotlin/KEEP/blob/master/proposals/inline-classes.md#type-mapping-on-jvm Inline-классы, основаннные на not-null примитиве (коим являются unsigned-ы), превращаются в примитивы. Так что оверхеда там не будет.

Nanodesu
15.08.2018
12:52:00
Всем привет. Хочу попробовать реализовать класс который будет отвечать за исполнение async и возвращать результаты в том порядке, в котором Deferred были исполнены, а не объявлены(чтобы например избежать ситуаций при которых первый Deferred может висеть 20 секунд, а остальные исполнятся за 1 секунду и нам придётся ждать выполнения первого и терять время). Собственно попробовал сделать два варианта(Kotlin 1.2.60): Первый принимает на вход коллекцию Deferred и достаёт оттуда результаты в порядке выполнения(вот код сразу с примером использования: https://pastebin.com/0HiNCmKC В этом случае всё работает корректно и Deffered выполняются параллельно, но при этом создавать коллекцию Deferred нужно заранее. Второй вариант принимает на вход коллекцию объектов с которыми необходимо провести манипуляции и функцию через которую нужно пропустить каждый из этих объектов(что синтаксически выглядит удобнее): https://pastebin.com/naT8wNWt В этом случае параллельно выполняется ровно по 3 Deffered(почему именно 3 - загадка, может там внутри какой-то тредпул из 3х тредов?) Собственно вопрос - почему во втором случае Deffered не исполняются все одновременно и как этого избежать?

Alexander
15.08.2018
14:09:41
Если вы хотите просто какую-то обработку делать по мере выполнения, то я бы просто подвесил реакторы класса onComplete (я не помню, как это сделать корутинами, но точно можно через CompletableFuture). Если вы хотите иметь поток, то надо использовать каналы

Alexander
15.08.2018
14:25:00
Нет времени детально разбираться, но я подозреваю, что просто вопрос скорости, к тому времени, как собирается запулить четвертый, первый уже освобождается

Nanodesu
15.08.2018
14:29:08
4 процессора?
Ядра? Да. Могу проверить на 8и ядерной машине, тогда он по 7 должен будет обрабатывать?

Руслан
15.08.2018
14:29:16
Судя по всему - да)

Вообще я так понимаю хочется сделать примерно так: fun <T> toChannel(ds: List<Deferred<T>>): Channel<Deferred<T>> Берем все deffered, и как только любой из них выполняется так или иначе - кидаем его в канал

Nanodesu
15.08.2018
14:34:28
Да я вот только неделю в языке разбираюсь

Alexander
15.08.2018
14:36:32
Да тут не с точки зрения языка, с точки зрения корутин что-то ужасное. То, что вы хотите - это канал, его можно сделать на корутинах путем создания селектора, который будет считывать все по очереди, хотя правильнее конечно просто при создании Deferred сразу кидать все в канал.

Alexander
15.08.2018
14:39:17
Последовательость - это просто обычный статическсий итерируемый объект. Канал - это в каком-то смысле аналог очереди, туда с одного конца пихаешь, с другого вынимаешь. Разница в том, что если места нет, пихалка ставится на паузу.

Вообще, идея любых асинхронных вычислений в том, что вы не обрабатываете руками момент окончания вычисления. Отлавливать в цикле момент окончания - это вообще абсурд

Nanodesu
15.08.2018
14:43:30
Звучит разумно, надо значит с каналами разобраться, ок, спасибо

Alexander
15.08.2018
14:48:26
Если не хочется каналов, то есть решение чисто джавовское - это CompletableFuture, они организованы таким образом, что можно к концу одно прицепить начало нового.

Google
Alexander
15.08.2018
14:48:53
https://www.baeldung.com/java-completablefuture

Они работают на форк-джойн пуле, так что в смысле производительности не хуже корутин

Звучит разумно, надо значит с каналами разобраться, ок, спасибо
Вот кстати в документации практически ваш пример разобран: https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#selecting-deferred-values

Руслан
15.08.2018
15:00:45
Использовать deffered тут чтобы на него подписаться так или иначе и потом получить первым результат выглядит странным) Кажется что куда проще изначально просто на корутинах делать: fun <T> execute(fns: List<suspend () -> T>): ReceiveChannel<T> { val channel = Channel<T>(10) val count = AtomicInteger(0) val size = fns.size for (fn in fns) { launch { channel.send(fn()) if (count.incrementAndGet() == size) { channel.close() } } } return channel }

А вот так использовать: fun main(args: Array<String>) = runBlocking<Unit> { suspend fun doWork(duration: Int): String { delay(duration) return "Duration was: $duration" } val jobs = (10000 downTo 1).map { suspend { doWork(it) } } val receiveChannel = execute(jobs) runBlocking { for (s in receiveChannel) { println(s) } } }

Alexander
15.08.2018
15:04:59
это я согласен полностью.

Konstantine
15.08.2018
15:07:18
Кстати, если кто использует на ондроеды корутины (или видел хорошие живые примеры) скиньте пожалуйста что-нибудь. Посмотреть реальный опыт хочется, так вникать проще.

Konstantine
15.08.2018
15:11:23
Спасибо

Vishnyakov
15.08.2018
15:11:56
Спасибо
fun saveUserProfile() = launch(UI) { viewState.onSaveProfileStarted() val response = withContext(DefaultDispatcher) { profileApi.saveUserSelf(user) } viewState.onSaveProfileFinished() when (response) { is OkResponse -> viewState.onSaveProfileSuccess() is ErrorResponse -> viewState.onSaveProfileError(response.error) } }

Vishnyakov
15.08.2018
15:12:05
из свежего

Konstantine
15.08.2018
15:12:54
А то как из фона обращение к viewState -> view идет без падений

Vishnyakov
15.08.2018
15:13:08
А то как из фона обращение к viewState -> view идет без падений
лаунч в фоне если в скобках бы не было UI

Konstantine
15.08.2018
15:13:50
Т.е. если бы мне надо было обработать данные в фоне не затрагивая UI, достаточно было бы обернуть вызовы в launch?

Google
Vishnyakov
15.08.2018
15:15:02
где то был хороший цикл статей на медиуме сравнения эрикса и корутин возможностей

очень прокачал меня

найду

Konstantine
15.08.2018
15:15:12
да
Но, получается, что все функции там должны быть suspend? В данном случае в profileApi

Admin
ERROR: S client not available

Vishnyakov
15.08.2018
15:15:59
у тебя лаунч саспенд - этого достаточно

Т.е. если бы мне надо было обработать данные в фоне не затрагивая UI, достаточно было бы обернуть вызовы в launch?
https://medium.com/capital-one-developers/coroutines-and-rxjava-an-asynchronicity-comparison-part-1-asynchronous-programming-e726a925342a

Konstantine
15.08.2018
15:16:16
а, вот оно как. мне казалось внутри всё тоже должно быть

Vishnyakov
15.08.2018
15:16:22
остальные там в подвале

Alexander
15.08.2018
15:16:33
Это почему-то расхожее заблуждение

Vishnyakov
15.08.2018
15:16:34
Alexander
15.08.2018
15:16:50
Вообще не понятно на чем основанное

Vishnyakov
15.08.2018
15:17:08
Спасибо
офигенный цикл, крайне советую

Konstantine
15.08.2018
15:17:12
Вообще не понятно на чем основанное
Саспенды вызываются только из саспендов, вот оно как-то и закрутилось в голове

Vishnyakov
15.08.2018
15:21:07
в продакшене пара проектов есть с корутинами, и им там хорошо.

Иван
15.08.2018
15:51:54
Как бы сделать такое? Не может тип вывести при вызове. fun <T> getContextClosure(id: Int): ((Context) -> T) { val ctx = ... ... return { block: ((Context) -> T) -> block(ctx) ... } Вызвать пытаюсь так: getContextClosure(1) { ctx -> ... }

Работает только если явно указать тип дженерика и сохранить getContextClosure(1) в переменную: val f = getContextClosure<Int>(1)

Google
Иван
15.08.2018
15:55:16
Ну вот оно тип не выводит

Dibro
15.08.2018
15:57:02
Ну вот оно тип не выводит
так а откуда оно должно его вывести без дженерика

не понимаю чет

Ну вот оно тип не выводит
возвращается же замыкание, наружней функции тип заранее не известен

Иван
15.08.2018
16:03:12
Ну человек же может вывести, посмотрев)

Я так понимаю лучше дженерик перенести в замыкание?

Тогда будет ок?

Дженерик в лямбде

Dibro
15.08.2018
16:09:14
Иван
15.08.2018
16:10:10
как может? не понимаю
Вот по такой строке же можно тип сказать getContextClosure(1) { “123” }

Dibro
15.08.2018
16:10:37
вот в чем трабла

Andrew
15.08.2018
16:11:12
Вот по такой строке же можно тип сказать getContextClosure(1) { “123” }
Вывод типов, очевидно, должен сработать на момент вызова getContextClosure, а не после использования её результата.

Он в целом пляшет от входных параметров функции.

Иван
15.08.2018
16:12:04
Так как нужную кложу веруть? Можно в лямбду дженерик вкрутить?

Перенести T внутрь лямбды

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