
Igor
13.12.2017
14:52:30

Gor
13.12.2017
14:52:32

Roman
13.12.2017
14:52:55
По той же причине мне не нравится применение rx для асинхронности. Появляется куча лишнего шума в коде для превращения асинхронной программы в реактивную и уже далее работа с ней как с реактивной.

Sergey
13.12.2017
14:53:03
ну мне пока имхо проще на rx все делать)

Google

Sergey
13.12.2017
14:53:08
особенно там где нужна параллельность

Roman
13.12.2017
14:55:55

Sergey
13.12.2017
14:56:04
я правда с корутинами плотно не работал. не хватает по нему чтива структурированного типа "Reactive programming with RxJava"

Andrew
13.12.2017
14:56:16
видел PR с реализацией в K/N, который завёрнут с комментом "надо делать во взрослом котлине". сам жду -- как раз сейчас начал делать решение по обработке потока uint8, на ByteBuffer из NIO вязаться не хочу, ибо надеюсь на K/N соскочить в будущем.
Кстати о птичках. Про ULong/UInt/UShart/UByte все уже забыли? Никому не надо?
Я так просто вспомнил. На заре котлина что такое обсуждали.

Sergey
13.12.2017
14:56:54

Alexey
13.12.2017
14:57:44
Всем привет. Вопрос про котлиновский Int
Когда это, например, аргумент конструктора, котлиновский Int превращается в джавовский примитив int. Можно ли заставить его не делать это, а стать Integer'ом?
===
Зачем? Я делаю парсинг JSON'ов, и у меня есть, например, вот такая штука
>data class Paging(@JsonProperty(value = "PAGES") val pages: Int)
Если в JSON'е поля PAGES нет, я хочу, чтобы Jackson попробовал впихнуть туда null, чтоб я поймал исключение (со всякими String это работает просто на ура).
А вместо этого парсинг проходит без проблем, поле pages получается равным нулю

Roman
13.12.2017
14:57:44
Ну пока гиста хватит. Но репо - хорошая идея.
Int == int
Int? == Integer

Alexey
13.12.2017
15:00:00
ну а при этом по понятным причинам List<Int> == List<Integer>
это дало надежду на то, что есть волшебная аннотация, которая избавит меня от проблем

Руслан
13.12.2017
15:01:22
Всем привет. Вопрос про котлиновский Int
Когда это, например, аргумент конструктора, котлиновский Int превращается в джавовский примитив int. Можно ли заставить его не делать это, а стать Integer'ом?
===
Зачем? Я делаю парсинг JSON'ов, и у меня есть, например, вот такая штука
>data class Paging(@JsonProperty(value = "PAGES") val pages: Int)
Если в JSON'е поля PAGES нет, я хочу, чтобы Jackson попробовал впихнуть туда null, чтоб я поймал исключение (со всякими String это работает просто на ура).
А вместо этого парсинг проходит без проблем, поле pages получается равным нулю
Int? в джаве будет Integer
Ну и null можно засунуть

Andrew
13.12.2017
15:01:31
может, конечно, есть что-нибудь internal, но вообще эту магию (будет ли компилятор делать боксинг или нет) постарались максимально спрятать. вероятно, дабы оставить себе большее пространство для оптимизаций и подготовки к value types.

Google

Andrew
13.12.2017
15:01:51
но в целом я не видел возможности получить @NonNull java.lang.Integer

Alexey
13.12.2017
15:02:10
блин, грустно
спасибо за ответы

Руслан
13.12.2017
15:02:33
jackson-kotlin-module используется?

Alexey
13.12.2017
15:02:39
агась

Руслан
13.12.2017
15:02:50
и он не падает тут?
если null и Int

Andrew
13.12.2017
15:03:17
сказал я и задумался -- а это, кто-нибудь пробовал использовать @NonNull / @Nullable из котлина? :D

Alexey
13.12.2017
15:03:26
не-а, не падает

Andrew
13.12.2017
15:05:29
может, кастомный десериалайзер? костыль, конечно, но зато в одном месте, а не по всему коду, которому нужен Int.

Artur
13.12.2017
15:06:02
Есть метод в JacksonMapper'е
public <T> T readValue(String content, Class<T> valueType)
вызываю
mapper.readValue(data, List<Flowchart>::class.java)
На что котлин при компиляции вежливо посылает
kotlin only classes are allowed on the left
Кто-нибудь знает как победить?

Руслан
13.12.2017
15:06:05
не-а, не падает
Ну да, прикольно
data class Test(val value: Int)
fun main(args: Array<String>) {
val mapper = ObjectMapper().registerModule(KotlinModule())
println(mapper.readValue<Test>("""{"value":null}"""))
}

Alexey
13.12.2017
15:06:10
вот, могу дать короткий тест кейс
>data class Paging(@JsonProperty(value = "PAGES") val pages: Int)
>@Test
>public void testPagingEmpty() {
>try {
> Paging paging = objectMapper.readValue("{}", Paging.class);
> System.out.println(paging.getPages());
> Assert.fail();
> } catch (IOException ignored) {
> //all good. it should go here
> }
Парсинг проходит, тест проваливается, в выводе ожидаемо "0".

Andrew
13.12.2017
15:11:55
Я тут вот что нагуглил:
https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html#FAIL_ON_NULL_FOR_PRIMITIVES
С Jackson не работал, потому не могу утверждать, что ответ на вопрос, но мало ли :)

Alexey
13.12.2017
15:13:38
чёрт, решение надо было искать в самом джексоне.
с этой штукой всё работает, как ожидаешь, спасибо большое

Andrew
13.12.2017
15:15:03
Из джавадока не сильно понятно, будет ли оно падать при отсутствующем значении, очевидно только при присутствующем null (хотя это ж JSON, в нём по-хорошему null вообще нету, так что по идее должно покрывать оба кейса).

Alexey
13.12.2017
15:15:40
все тесты только что загорелись зелёненьким)

Andrew
13.12.2017
15:16:19
Поздравляю :)

Roman
13.12.2017
15:17:07

Igor
13.12.2017
15:22:43
- Тройные кавычки.
- Честно говоря, такой себе пример, just там вычисляются сразу на месте и идут сразу закомпличенные.
- Его моего просто на котлин коллекции переписать

Google

Igor
13.12.2017
15:24:20
Или далее на константу (я оптимизировал код)
val oc = 0

Sergey
13.12.2017
15:38:21
странный пример как-то)
хоть бы delay какой-то добавил или defer

Konstantine
13.12.2017
16:12:06
Имея объект clazz: Class<?> можем ли мы кастануть на этот класс другой объект? Есть некий метод clazz.cast(), но он возвращает Any.

Quantum Harmonizer
13.12.2017
16:13:49
Он возвращает Any, потому что у тебя Class<*>.

Igor
13.12.2017
16:16:49

Roman
13.12.2017
16:42:30
Ну это ведь просто пример, just самый простой способ создать Observable.

Vadim
13.12.2017
16:45:08
Рисковано, но српошу)
есть канал по RX?)
Так решил убить себя морально))

Igor
13.12.2017
16:45:18

Konstantin
13.12.2017
16:45:46

Vadim
13.12.2017
16:46:42
@MightySeal благодарю)

Roman
13.12.2017
16:48:37
Если напишешь - будет ?
Есть zip, но именно так не компилится.
А вот так норм:
val oc = oa.zip(ob, Unconfined, Int::plus)

Руслан
13.12.2017
16:49:22
transform = Int::plus

Roman
13.12.2017
16:49:47
Ага, так тоже пойдет.

Igor
13.12.2017
16:53:26

Roman
13.12.2017
16:54:28
Правда там zip только для двух каналов. Для большего количества еще не написано.
Надо теперь разобраться, что именно там за zip. Это аналог rx.zip или rx.CombineLatest.

Sergey
13.12.2017
17:09:31
ну зипы разные можно сделать)

Roman
13.12.2017
17:10:57
Кстати пример на rx надо подправить, там не зип должен быть, а комбайн по условиям задачи. Я ошибся чутка.

Google

Roman
13.12.2017
17:11:16
Теперь вопрос еще как написать комбайн на корутинах... Щас попробую.

Sergey
13.12.2017
17:11:24
zip чаще всего используется как await нескольких событий

Osip
13.12.2017
17:43:24
Меня вот мучает вопрос.
Если я друг за другом у коллекции использую
filter, map, find и т.д. это всё превращается в итоге в один цикл или как?
Извините, если вопрос совсем нубский

Roman
13.12.2017
17:44:30
Нет, каждая функция создаст новую коллекцию.

Anton
13.12.2017
17:44:59
Можешь юзать sequence

Roman
13.12.2017
17:44:59
А вот если использовать asSequence, то там не все так однозначно.

Osip
13.12.2017
17:46:22
О как. А в доках это описано? Я как-то упустил этот момент

Admin
ERROR: S client not available

Roman
13.12.2017
17:46:44
Конечно.
Более того, всегда можно посмотреть как оно работет внутри, исходники то открыты.

Osip
13.12.2017
17:47:24
Буду очень рад ссылке.

Dibro
13.12.2017
17:47:37
Returns a list containing the results of applying the given transform function to each element in the original array.

Abbas
13.12.2017
17:47:42
в idea всегда можно посмотреть во что это генерится

Osip
13.12.2017
17:49:09
Ну я думал вдруг как-то эти инлайн функции по хитрому оптимизируются компилятором.

Alexander
13.12.2017
17:50:12
Декомпайл?

Dibro
13.12.2017
17:50:22

Osip
13.12.2017
17:50:36
А. Думал есть другой способ

Abbas
13.12.2017
17:50:46
а потом Decompile

Google

Osip
13.12.2017
17:50:47
Спасибо

Roman
13.12.2017
17:54:59
https://gist.github.com/romansl/6a050ccac6c7dcb7d624db8f0ebf913c

Alexander
13.12.2017
18:06:01
Нерабочая*

Жабра
13.12.2017
18:12:23
В прошлый раз подумал что это был единичный баг и как-то поправил, но эта дичь продолжается.
Очень дурацкий вопрос, но всё же
val fullName = text.split(" ")
for (x in fullName) {
x.toLowerCase()
x[0].toUpperCase()
}
Почему не меняется ничего??
Переделываю вводимую информацию
Имя Фамилия Отчество

Andrew
13.12.2017
20:09:56
String -- штука иммутабельная. Почитайте, что именно делает .toLowerCase().

Жабра
13.12.2017
20:10:43
А, всё понял. Туплю, извините.

Andrew
13.12.2017
20:11:46
Да ну что вы :)

Igor
13.12.2017
20:21:25
В JB говорят что пофиксили уже давно. Если у тебя это повторяется - переоткрой им багу
https://youtrack.jetbrains.com/issue/KT-16891

Никита
13.12.2017
21:09:27
А ни у кого часом не завалялась ссылочка на .pdf Kotlin in Action? Желательно на русском языке, но и англ варианту буду рад)
или данного ресурса достаточно будет? https://try.kotl.in/

Anton
13.12.2017
21:11:57
тут собрались честные граждане которые покупают книги а не скачивают их незаконно!!!!!!

Никита
13.12.2017
21:12:37
Я бедный студент, у меня нет денег на книгу)
Да и заказывать из России долго :)