Как стать автором
Обновить

Комментарии 13

Вот только на андроиде лямбды нужно костылировать через RetroLambda и там каждая лямбда вроде как переходит в анонимный класс.
Как это сказывается на производительности?
Я лично тестов не проводил, но мне кажется, что никак это не сказывается на производительности: в одном случае мы сами напишем anonymous inner class, в другом retrolambda развернёт лямбду в него же. К тому же, судя по документации, если лямбда является stateless, то retrolambda создаёт синглетон и в дальнейшем использует его повсюду, где используется данная лямбда.
Но всё это просто рассуждения без цифр, буду рад если кто-нибудь меня поправит.
По факту, в случае stateless лямбд (без замыканий) код с Retrolambda будет даже быстрее, чем классический для Java 6 и 7, ведь обычно пишут так:

handler.post(new Runnable()
{
    @Override
    public void run()
    {
        // ...
    }
});

А если в этот классический код ввести синглтон, ухудшится читабельность кода, т.к. тело run() будет написано в другом месте, нежели в handler.post(), да ещё и довольно далеко, т.к. static-переменные в Java нельзя описывать в теле метода — только в теле класса. А сравнивать производительность с «настоящей» Java 8 смысла нет, потому что её нет в Android, и так или иначе остаётся только выбор между классикой и Retrolambda.
В 8 лямбды и method reference — это тоже анонимные классы. В этом нет ничего особо ужасного, хотя они и жрут metaspace потихоньку.
Ну, уже да. Но в сравнении с анонимными классами из Java6/7 у них есть ряд существенных отличий.
Как минимум, они значительно быстрее из-за invokeDynamic
Посмотрел в байткод, anonymous inner class и lambda таки в 8 различаются. На openjdk 8u60 анонимные классы компилируются по прежнему (new + dup + aload_0 + invokespecial + использование). А лямбды — в invokedynamic + использование.
Спасибо что сказали, я думал что анонимные классы уже полностью превратили в лямбды.
Привет. Решил разобраться с RxJava на Android'e немного.
Во-вторых, у нас есть AndroidObservable
В какой библиотеке оно лежит?
compile 'io.reactivex:rxandroid:1.0.1'
— там нет.
Этого уже нет, статьи Grokking RxJava немного устарели. Для работы с UI через Rx используйте RxBindings github.com/JakeWharton/RxBinding
Спасибо, посмотрю.
Привет. спасибо за статьи, познавательно. Мне только не хватило информации как Rx обкладывается тестами. На андроиде в том числе.

TestSubscriber, TestScheduler. Лучше не использовать хуки для подмены шедулеров (личный совет).

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории