
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

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

Dimon
15.08.2018
10:45:06
других реализаций я не нашёл
или код майлстоуна 1.3 не опубликован?

Andrew
15.08.2018
10:46:12

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). Если вы хотите иметь поток, то надо использовать каналы

Nanodesu
15.08.2018
14:22:38

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

Руслан
15.08.2018
14:27:28

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, и как только любой из них выполняется так или иначе - кидаем его в канал

Alexander
15.08.2018
14:34:01
Я посмотрел, код вообще какой-то страшный.

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

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

Nanodesu
15.08.2018
14:37:52

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


Руслан
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
Кстати, если кто использует на ондроеды корутины (или видел хорошие живые примеры) скиньте пожалуйста что-нибудь. Посмотреть реальный опыт хочется, так вникать проще.

Vishnyakov
15.08.2018
15:07:43
сек
корутины в презентерах

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

Vishnyakov
15.08.2018
15:12:53

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

Vishnyakov
15.08.2018
15:13:08

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

Vishnyakov
15.08.2018
15:14:12

Google

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

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

Vishnyakov
15.08.2018
15:15:41

Admin
ERROR: S client not available

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

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
Вообще не понятно на чем основанное

Konstantine
15.08.2018
15:16:51

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)

Dibro
15.08.2018
15:55:01

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

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

Andrew
15.08.2018
16:11:12
Он в целом пляшет от входных параметров функции.

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