Size: a a a

Kotlin Community

2020 September 08

BP

Bogdan Panchenko in Kotlin Community
Alexander Nozik
Надяться не надо, надо мерить.
Если такая переменная покидает локальный скоуп - ничего не будет
источник

AN

Alexander Nozik in Kotlin Community
Bogdan Panchenko
Если такая переменная покидает локальный скоуп - ничего не будет
Будет. в современных JVM, а особенно в граале эскейп анализ на несколько уровней работает
источник

BP

Bogdan Panchenko in Kotlin Community
Alexander Nozik
Будет. в современных JVM, а особенно в граале эскейп анализ на несколько уровней работает
Без Грааля. Но и в "современных" jvm все зависит от жизненного цикла переменной, если ее нельзя предсказать, то не будет оптимизации
источник

A

Aleksandr in Kotlin Community
Есть функция:
inline fun <T> Flow<List<T>?>.filterListElements(crossinline predicate: (T) -> Boolean): Flow<List<T>?> =
       transform { list -> return@transform emit(list?.filter(predicate)) }

которая прекрасно работала до kotlin 1.4.0 и coroutine 1.3.9, теперь если начальный Flow содержит null, то он падает по list?.filter(predicate) must not be null. Причём если в transform явно дописать transform<List<T>?, List<T>?>, то всё будет ок. Я так понимаю это бага. Только чья?
источник

AN

Alexander Nozik in Kotlin Community
Aleksandr
Есть функция:
inline fun <T> Flow<List<T>?>.filterListElements(crossinline predicate: (T) -> Boolean): Flow<List<T>?> =
       transform { list -> return@transform emit(list?.filter(predicate)) }

которая прекрасно работала до kotlin 1.4.0 и coroutine 1.3.9, теперь если начальный Flow содержит null, то он падает по list?.filter(predicate) must not be null. Причём если в transform явно дописать transform<List<T>?, List<T>?>, то всё будет ок. Я так понимаю это бага. Только чья?
Это не совсем бага, это поменялся вывод типов. Плохо, что оно упало при переходе, но вообще в таких случаях лучше тип явно указывать. А уронилось при компилляции?
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
Это не совсем бага, это поменялся вывод типов. Плохо, что оно упало при переходе, но вообще в таких случаях лучше тип явно указывать. А уронилось при компилляции?
Нет, в рантайме
источник

AN

Alexander Nozik in Kotlin Community
Aleksandr
Нет, в рантайме
Вот это уже очень странно. У вас там как бы или есть null или нет. От вывода типов это не должно зависеть
источник

AN

Alexander Nozik in Kotlin Community
Ну и к слову, зачем там вообще Inline?
источник

AN

Alexander Nozik in Kotlin Community
И зачем там return? Что оно вообще делает?
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
Ну и к слову, зачем там вообще Inline?
Делал по аналогии с filter, но видимо стоит побольше почитать про inline.
источник

AN

Alexander Nozik in Kotlin Community
Aleksandr
Делал по аналогии с filter, но видимо стоит побольше почитать про inline.
Просто crossinline практически или совсем невелирует плюс от инлайна. Ну и не понятно, зачем там еще возврат в лямбде
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
И зачем там return? Что оно вообще делает?
Согласен, он там избыточен. Опять же написал глядя на реализацию filter
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
Просто crossinline практически или совсем невелирует плюс от инлайна. Ну и не понятно, зачем там еще возврат в лямбде
Тогда что вы скажете про реализации библиотечной filter. В чём разница?
источник

AN

Alexander Nozik in Kotlin Community
Aleksandr
Согласен, он там избыточен. Опять же написал глядя на реализацию filter
Вообще, у меня такое ощущение, что вам вообще нужен был
map{it?.filter(predicate)}
Вместо всей конструкции
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
Вообще, у меня такое ощущение, что вам вообще нужен был
map{it?.filter(predicate)}
Вместо всей конструкции
map по-факту тот же transform. Мне не хотелось везде писать map{it?.filter(predicate)}, поэтому выделил в отдельную функцию. При реализации смотрел на библиотечные аналоги, в которых в основном используется transform.
источник

AN

Alexander Nozik in Kotlin Community
Aleksandr
map по-факту тот же transform. Мне не хотелось везде писать map{it?.filter(predicate)}, поэтому выделил в отдельную функцию. При реализации смотрел на библиотечные аналоги, в которых в основном используется transform.
Так почему в функции не сделать этот самый мап, а строить что-то свое?
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
Так почему в функции не сделать этот самый мап, а строить что-то свое?
Согласен. Так и сделаю.
источник

A

Aleksandr in Kotlin Community
Alexander Nozik
Так почему в функции не сделать этот самый мап, а строить что-то свое?
Переделал, ошибка исчезла.
источник

AN

Alexander Nozik in Kotlin Community
Aleksandr
Переделал, ошибка исчезла.
Ну там просто менее монструозный вывод типов получается. Вообще общая рекомендация - не изобретать велосипед без острой необходимости.
источник

A

Aleksandr in Kotlin Community
Aleksandr
Переделал, ошибка исчезла.
Map использует unsafeTransform вместо transform, если я правильно понимаю.
источник