Developer's Sandbox
رفتن به کانال در Telegram
Опыт и самообучение практикующего разработчика Связь с автором: @alpa1479
نمایش بیشتر1 059
مشترکین
اطلاعاتی وجود ندارد24 ساعت
اطلاعاتی وجود ندارد7 روز
اطلاعاتی وجود ندارد30 روز
آرشیو پست ها
1 059
#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
1 059
#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
1 059
#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
1 059
#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
1 059
Более подробное описание канала:
Здесь я буду публиковать теорию с рабочими примерами на github по различным технологиям и вопросам с собеседований, где каждый может сделать fork и предложить изменение через pull request.
Это пространство для обмена знаниями, где можно общаться на тему разработки, делиться опытом и полезными материалами, обозревать книги и доклады.
Есть идеи, которые в будущем можно реализовать:
- Проводить Mock-интервью
- Делать совместное code review
- Устраивать соревнования с вознаграждениями на самый лучший ответ на вопрос с собеседования, а также на самое лучшее решение алгоритмической задачи либо задачи на системный дизайн
По вопросам и предложениям можно писать мне - @alpa1479 либо просто оставлять комментарии под одним из постов
