Ответ вслух Senior Лямбды, inline и reified обновлено

Inline-функции: когда и зачем

Вопрос

Объясни, что такое inline-функции, какие возможности они дают и какие есть подводные камни.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Обычная функция, принимающая лямбду, на JVM получает объект функционального интерфейса, а если лямбда захватывает переменные, этот объект создаётся при каждом вызове. Inline-функция решает это: компилятор копирует её тело и тело лямбды прямо в место вызова, объекта нет.

Что должно прозвучать в ответе

  • Тело функции и лямбд копируется в место вызова

  • Нет объекта лямбды и вызова через интерфейс

  • Даёт non-local return и reified

  • noinline и crossinline для особых случаев

  • Минус: раздувание кода, нет смысла без лямбд-параметров

  • Публичная inline-функция не может обращаться к private-членам

Что могут спросить следом

  • Почему forEach можно прервать через return, а обычную функцию нет?
  • Что такое @PublishedApi?
  • Можно ли вызвать reified-функцию из Java?

Разбор

Обычная функция, принимающая лямбду, на JVM получает объект функционального интерфейса, а если лямбда захватывает переменные, этот объект создаётся при каждом вызове. Inline-функция решает это: компилятор копирует её тело и тело лямбды прямо в место вызова, объекта нет. Поэтому map, filter, let, apply в stdlib inline. Это даёт две возможности. Non-local return: return внутри лямбды выходит из внешней функции. И reified: в месте вызова тип известен, поэтому можно писать T::class и is T. Для особых случаев есть noinline, если лямбду надо сохранить как объект, и crossinline, если её вызывают из вложенного контекста. Минусы: раздувание байткода, поэтому инлайнить стоит небольшие функции с лямбдами. Публичная inline-функция не может трогать приватные члены класса, для этого есть @PublishedApi internal. Reified-функции нельзя вызвать из Java.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.