Лекция для сотрудников фирмы Soft-logic, проведенная 13.11.2014. В ходе лекции рассматривались следующие ключевые моменты:
1. Назначение lambda-выражений
2. Синтаксис lambda-выражений
3. Функциональные интерфейсы
4. Default и статические методы в интерфейсах
5. Ссылки на методы
6. Область действия переменных
7. Трансляция lambda-выражений
8. Сериализация lambda-выражений
Лекция для студентов АлтГТУ, проведенная 04.03.2015. В ходе лекции рассматривались следующие ключевые моменты:
1) Lambda project
2) Steam API
3) Date API
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Со времён С++98 стандартные контейнеры и идиома RAII позволяли избегать использования оператора delete, что делало код более безопасным. С приходом С++11 и умных указателей отпала необходимость использовать оператор new, что позволило практически полностью переложить управление памятью на плечи компилятора. В докладе объясняется идеология управления памятью и ресурсами в современном С++.
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
Предлагаемый подход позволяет без труда получить параллельную асинхронную обработку данных без явного использования средств синхронизации, по максимуму задействуя доступные вычислительные ресурсы. Использование сопрограмм значительно упрощает написание многопоточного кода. Это дает возможность сконцентрироваться непосредственно на задаче обработки данных, не занимаясь вопросами синхронизации различных операций, включая асинхронную работу с сетью.
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Лекция для студентов АлтГТУ, проведенная 04.03.2015. В ходе лекции рассматривались следующие ключевые моменты:
1) Lambda project
2) Steam API
3) Date API
Доклад о дизайне кода в функциональном стиле на C++, представленный вниманию плюсовиков на C++ User Group Novosibirsk 2014.
В качестве демонстрационного проекта была реализована игра "Амбер" по мотивам "Хроник Амбера" Р. Желязны.
https://github.com/graninas/Amber
Со времён С++98 стандартные контейнеры и идиома RAII позволяли избегать использования оператора delete, что делало код более безопасным. С приходом С++11 и умных указателей отпала необходимость использовать оператор new, что позволило практически полностью переложить управление памятью на плечи компилятора. В докладе объясняется идеология управления памятью и ресурсами в современном С++.
Григорий Демченко, “Асинхронность и сопрограммы: обработка данных“Platonov Sergey
Предлагаемый подход позволяет без труда получить параллельную асинхронную обработку данных без явного использования средств синхронизации, по максимуму задействуя доступные вычислительные ресурсы. Использование сопрограмм значительно упрощает написание многопоточного кода. Это дает возможность сконцентрироваться непосредственно на задаче обработки данных, не занимаясь вопросами синхронизации различных операций, включая асинхронную работу с сетью.
Рассмотрены известные автору подходы к реализации как lock-free, так и fine-grained lock-based set/map: хеш-таблицы, деревья. Что из подходов STL может быть реализовано в lock-free манере, а что принципиально нет. Подводные камни lock-free и их нейтрализация.
Павел Сушин «Асинхронное программирование на С++: callbacks, futures, fibers»Platonov Sergey
За время работы над проектом был разработан удобный фреймворк для написания асинхронного кода. В докладе будет рассмотрено то, как он устроен и как со временем эволюционировал. Разберемся, как с помощью наших примитивов решать проблемы, часто встречающиеся в асинхронном программирование; будут примеры удачного и неудачного использования. Отдельно остановимся на сравнении получившихся средств с тем, что было добавлено в С++11.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Функциональное программирование в примерах.
Язык Haskell: характеристики, история, сильные и слабые стороны, истории успеха и неудач.
Спецификация Haskell’98: синтаксис, компиляторы, интепретаторы, документация, IDE.
Особенности языка: тип Maybe, списки, классы типов, основы монад.
Библиотеки и фреймворки: Parsec, GenXml, HaXml
DSL
На десерт что-то из Existential Types, State Monad, ST Monad, Monad Transformers.
Дмитрий Прокопцев, Яндекс
Речь пойдёт о, наверное, одном из самых важных и в то же время сложных нововведений в С++11 — R-ссылках (rvalue references). Мы рассмотрим базовые правила работы с такими ссылками и связанные с ними новые концепции языка: перемещение классов, универсальные ссылки и перенаправление вызовов.
20 most important java programming interview questionsGradeup
The document discusses 20 important Java programming interview questions. It covers topics such as the differences between interfaces and abstract classes, when to use abstract classes versus interfaces, what the Serializable interface does, how to force garbage collection, the differences between StringBuffer and StringBuilder, checked and unchecked exceptions, how Java allocates stack and heap memory, Java reflection, the Java Virtual Machine, the differences between JDK and JRE, and more.
JDK.IO 2016 (http://jdk.io)
Java EE 7 introduced a new batch processing API. This session will go over how to use the batch processing API introduced with Java EE 7. This API is makes it easy to implement long running data/compute intensive jobs which need to be scheduled or initiated on-demand. Basics of the API will be demonstrated via code samples. The API will also be compared to Spring Batching and Hadoop to provide context and guidance on when these technologies are appropriate.
Top 50 java ee 7 best practices [con5669]Ryan Cuprak
JavaOne 2016
This session provides 50 best practices for Java EE 7, with examples. The best practices covered focus primarily on JPA, CDI, JAX-WS, and JAX-RS. In addition, topics involving testing and deployment are covered. This presentation points out where best practices have changed, common misconceptions, and antipatterns that should be avoided. This is a fast-paced presentation with many code samples.
Технический семинар для сотрудников компании МаксимаТелеком , проведенная 18.05.2016. В ходе семинара рассматривались следующие ключевые моменты:
1) IoC принцип
2) Beans life cycle
4) AOP
5) Spring proxy
31 мая – 1 июня в Киеве состоялась конференция HOTCODE 2013.
Сергей Тепляков, эксперт Luxoft Training по .Net, С++ и архитектуре приложений, выступил с докладом «C# Deep Dive».
Тезисы доклада:
«Когда-то в далеком 2002-м году язык C# был прост, как 2 копейки. Но у любого «живого» языка есть одна особенность, приятная и неприятная одновременно — в язык начинают добавляться новые возможности, чтобы наши с вами типовые задачи решались проще и эффективнее. Но с каждой новой возможностью появляются и свои тонкости, незнание которых может лишить столь нужных в нашей жизни конечностей, причем иногда самым изощренным образом. А поскольку язык C# развивается очень динамично, то за время жизни на его просторах появилось много маленьких грабелек, которые мы с вами и научимся обходить ;)».
Николай Паламарчук "Functional Programming basics for PHP developers"Fwdays
Functional Programming becomes very popular nowadays. What is it? Is it a hype or panacea? Should you deal with it as a PHP programmer? Let's find out!
Olexandra Dmytrenko
QA Automating at EPAM Systems
I'll show you how to switch from writing standard code using good old Java7 into writing it using functional way presented in Java8. The training is counted on beginners in the subject who like discovering the new horizons or for those who want to become more firm in using the new lambda features.
Основы языка Питон: функции, элементы функционального программирования, списочные выражения, генераторы. Презентация к лекции курса "Технологии и языки программирования".
Евгений Котельников. Зависимые типы в HaskellFProg
Системы зависимых типов позволяют оперировать данными на уровне типов, что может значительно повысить точность спецификации программ. Несмотря на отсутствие поддержки самих зависимых типов в Haskell, некоторые их свойства могут быть реализованы с помощью расширений языка. Будет представлен ряд техник, приближающий Haskell к возможностям языков вроде Agda, Coq и Epigram. Доклад имеет вводный характер и не требует предварительных знаний в обсуждаемых в нём темах.
Rust: абстракции и безопасность, совершенно бесплатноOpen-IT
Владимир Матвеев: "Rust: абстракции и безопасность, совершенно бесплатно" (Обзор языка Rust: для чего он предназначен, его ключевые особенности, инфраструктура)
6. Примеры стандартных
функциональных интерфейсов
Функциональный
интерфейс
Типы параметров Возвращаемый тип Имя абстрактного
метода
Runnable Отсутствует Void run
Supplier<T> Отсутствует T get
Consumer<T> T Void accept
BiConsumer<T, U> T, U Void accept
Function<T, R> T R apply
BiFunction<T,U, R> T, U R apply
UnaryOperator<T> T T apply
BinaryOperator<T> T, T T apply
Predicate<T> T Boolean test
BiPredicate<T,U> T,U Boolean test
7. Примеры стандартных
функциональных интерфейсов
для примитивов
Функциональный
интерфейс
Типы параметров Возвращаемый тип Имя абстрактного
метода
LongFunction<T> long T apply
LongToIntFunction long int apply
ToLongFunction<T> T long apply
8. Ссылки на методы
▪ объект :: метод экземпляра
▪ класс :: статический метод
▪ класс :: метод экземпляра
В том числе:
▪ this :: метод экземпляра
▪ super :: метод экземпляра
▪ класс:: new
9. Область действия переменных
▪ Кодовый блок
▪ Параметры
Lambda выражение категории noncapturing :
▪ Кодовый блок
▪ Параметры
▪ Значение свободных
переменных
Lambda выражение категории capturing :
11. Область действия переменных
Legal: x и y являются effectively final
void m1(int x) {
int y = 1;
foo(() -> x+y);
}
Legal: x и y являются effectively final
void m2(int x) {
int y;
y = 1;
foo(() -> x+y);
}
Illegal: y являются effectively final, но гарантировано
не инициализирована.
void m3(int x) {
int y;
if (...) y = 1;
foo(() -> x+y);
}
Legal: x и y являются effectively final
void m4(int x) {
int y;
if (...) y = 1; else y = 2;
foo(() ->; x+y);
}
12. Область действия переменных
Illegal : x не являются effectively final
void m5(int x) {
int y;
if (...) y = 1;
y = 2;
foo(() -> x+y);
}
Illegal: x не являются effectively final
void m6(int x) {
foo(() -> x+1);
x++;
}
Illegal : x не являются effectively final
void m7(int x) {
foo(() -> x=1);
}
Illegal : y не являются effectively final
void m8() {
int y;
foo(() -> y=1);
}
13. Invokedynamic
Первый вызов: Последующие вызовы:
invokedynamic
BootStrap метод
CallSite
MethodHandle
public Object foo(..){…}
вызывает
возвращает
Указывающий на
invokedynamic
CallSite
MethodHandle
public Object foo(..){…}
Извлекае MH из
Указывающий на
или сразу
вызывает
метод
напрямую
14. Invokedynamic
Пример:
Printer p = System.out::println;
p.print("Str");
MethodHandle
Хранит указатель на метод
CallSite
Объект,
описывающий
«место» вызова в
коде
15. Трансляция lambda выражений
Стратегия 1. Lambda выражение категории noncapturing :
Исходный код:
class A {
public void foo() {
List<String> list = ...
list.forEach( s -> {
System.out.println(s);
} );
}
}
Оттранслированый код:
class A {
public void foo() {
List<String> list = ...
list.forEach(
indy((MH(metaFactory),
MH(invokeVirtual Consumer. accepts),
MH(invokeStatic A.lambda$1)( )));
}
private static void lambda$1(String s) {
System.out.println(s);
}
}
16. Трансляция lambda выражений
Стратегия 2. Lambda выражение категории capturing :
Исходный код:
class B {
public void foo() {
List<String> list = ...
final int bottom = ..., top = ...;
list.removeIf( s ->
(s. length() >= bottom &&
s. length() <= top) );
}
}
Оттранслированый код:
class B {
public void foo() {
List<String> list = ...
final int bottom = ..., top = ...;
list.removeIf(
indy((MH(metaFactory),
MH(invokeVirtual Predicate.apply),
MH(invokeStatic B.lambda$1))( bottom, top )))); }
static boolean lambda$1(int bottom, int top, String s) {
return (p. length() >= bottom && p. length() <= top;
}
}
17. Трансляция lambda выражений
Стратегия 3. Lambda выражение категории capturing :
Исходный код:
class B {
final int bottom = ..., top = ...;
public void foo() {
List<String> list = ...
list.removeIf( s ->
(s. length() >= bottom &&
s. length() <= top) );
}
}
Оттранслированый код:
class B {
final int bottom = ..., top = ...;
public void foo() {
List<String> list = ...
list.forEach(
INDY((MH(metaFactory),
MH(invokeVirtual Predicate.apply),
MH(invokeVirtual B.lambda$1))( this )))); }
private boolean lambda$1(Element e) {
return e.getSize() < minSize;
}
}
18. Трансляция lambda выражений
Стратегия 4. Ссылка на метод :
Исходный код:
class A {
public void foo() {
List<String> list = ...
list.filter(String::isEmpty) }
}
Оттранслированый код:
class A {
public void foo() {
List<String> list = ...
list.filter(
indy(MH(metaFactory),
MH(invokeVirtual Predicate.apply),
MH(invokeVirtual String.isEmpty))()))
}
}
22. Использованные источники
▪ Кей С. Хорстманн – Java SE 8. Вводный курс
▪ JLS - Lambda Expressions
[http://docs.oracle.com/javase/specs/jls/se8/html/ ]
▪ Translation of Lambda Expressions
[http://cr.openjdk.java.net/~briangoetz/lambda/lambda-translation.html
]
▪ State of the Lambda
[http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-4.html]
▪ Д. Сосноски - Изменения в языке Java 8
[http://www.ibm.com/developerworks/ru/library/j-java8lambdas/]