fa
Feedback
Developer's Sandbox

Developer's Sandbox

رفتن به کانال در Telegram

Опыт и самообучение практикующего разработчика Связь с автором: @alpa1479

نمایش بیشتر
1 059
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
#sandbox_java #lambda_expressions Всегда ли метод референс имеет такое же поведение как и лямбда выражение? В случае если можно сократить лямбда выражение, можно использовать метод референс, который будет выглядеть более читабельно и при этом поведение будет таким же. Но есть некоторые неочевидные моменты: - Если производить какие-либо вычисления, а после этого брать у результата метод референс, то такие вычисления не будут ленивыми - Метод референс может завязаться на ссылку, которая в будущем будет изменена - Неявно можно создать capturing лямбда выражение, вместо non-capturing Эти примеры доступны по ссылке: https://github.com/alpa1479/sandbox-java/tree/main/examples/lambda-expressions/src/main/java/edu/sandbox/lambdaexpressions/methodreferences

#sandbox_java #lambda_expressions Как Capturing лямбда выражение влияет на GC? Во время выполнения приложения, когда поток доходит до метода, в котором находится capturing лямбда выражение, создается объект класса, сгенерированного LambdaMetafactory, для выполнения логики внутри лямбда выражения. Таким образом, если мы часто выполняем метод в котором находится capturing лямбда выражение, будут часто создаваться новые объекты, что повлияет на работу GC. Этого можно избежать благодаря оптимизациям JVM таким как escape analysis и method inlining. Однако такие оптимизации срабатывают не всегда. Например если метод достаточно большой, с конфигурацией по-умолчанию JVM может не заинлайнить метод. Как обычным вызовом метода вывода пустой строки на консоль увеличить нагрузку на GC в несколько раз? Ответ и теория на практике в примере: https://github.com/alpa1479/sandbox-java/tree/main/examples/lambda-expressions/src/main/java/edu/sandbox/lambdaexpressions/gcimpact

#sandbox_java #lambda_expressions Какие бывают типы лямбда выражений и в чем их различие? Non-Capturing: - Может использовать внешние статические переменные и методы, не зависит от нестатического контекста - Не использует внешние локальные переменные в методе в котором объявлена или нестатические поля класса или методы - Благодаря оптимизации JVM объект такого лямбда выражения может быть создан 1 раз и переиспользован Capturing: - Использует внешние локальные переменные или нестатические поля класса или методы - Отсутствует оптимизация JVM, каждый раз будет создан новый объект сгенерированного класса, выполняющий лямбда выражение Теорию можно посмотреть на рабочих примерах: https://github.com/alpa1479/sandbox-java/tree/main/examples/lambda-expressions/src/main/java/edu/sandbox/lambdaexpressions/types

#sandbox_java #anonymous_classes_vs_lambda_expressions В чем разница между анонимным классом и лямбда выражением и какие у них есть особенности? Анонимный класс: - Генерируется компилятором - Может реализовать тип с множеством методов - Может иметь состояние и сохранять его между вызовами методов - Не может иметь больше одного объекта, а также иметь конструктор или быть абстрактным или реализовывать несколько интерфейсов - Для работы с внешними локальными переменными они должны быть effectively final - Создает новый scope, если объявить переменную с таким же именем что и внешняя, то она скроет внешнюю переменную - ‘this’ внутри анонимного класса будет обращаться к объекту анонимного класса Лямбда выражение: - Создается в runtime через LambdaMetafactory - Может быть использовано только с функциональными интерфейсами - Не имеет состояния, если внутри явно каким-то образом не завязываться на состояние внешнего объекта через ссылку - Является анонимной функцией, соответственно не имеет полей, конструкторов и т.д. - Для работы с внешними локальными переменными они должны быть effectively final - Не создает новый scope, если объявить переменную с таким же именем что и внешняя, то будет ошибка компиляции - ‘this’ внутри лямбда выражения обращается объекту внешнего класса, если выражение не объявлено в статическом контексте Теорию можно посмотреть на рабочих примерах: https://github.com/alpa1479/sandbox-java/tree/main/examples/anonymous-classes-vs-lambda-expressions/src/main/java/edu/sandbox/anonymousclassesvslambdaexpressions

Более подробное описание канала: Здесь я буду публиковать теорию с рабочими примерами на github по различным технологиям и вопросам с собеседований, где каждый может сделать fork и предложить изменение через pull request. Это пространство для обмена знаниями, где можно общаться на тему разработки, делиться опытом и полезными материалами, обозревать книги и доклады. Есть идеи, которые в будущем можно реализовать: - Проводить Mock-интервью - Делать совместное code review - Устраивать соревнования с вознаграждениями на самый лучший ответ на вопрос с собеседования, а также на самое лучшее решение алгоритмической задачи либо задачи на системный дизайн По вопросам и предложениям можно писать мне - @alpa1479 либо просто оставлять комментарии под одним из постов