- PVSM.RU - https://www.pvsm.ru -

Расширенный материал по Java 8

Не секрет, что многие Java-программисты, начиная свой путь в индустрии, уделяют большое внимание «тяжелым» технологиям — OpenJPA, Spring, JAX-RS, EJB, WS-*,… Это дает возможность как скорее влиться в современные корпоративные проекты, так и максимизировать скорость роста зарплаты.

Многие из них в конце концов «спускаются» до технологий лежащих в основе указанных фреймворков — JDBC, Servlet API, NIO/NIO.2. Однако прискорбно, что зачастую не остается время на детальное изучение самого языка и возможностей платформы.

Речь идет не о тонкостях или экзотике, а о том, что составляет существенную часть работы фреймворка: Servlet-контейнер использует множественные ClassLoader-ы, JPA2-провайдер использует манипулирование байткодом, абсолютное большинство библиотек используют Reflection API, всеобщее использование Generics только «усугубилось» с появлением функциональных интерфейсов (java.lang.function.*) и лямбд.

На недопонимание изначальной платформы (ClassLoader, Reflection API) накладываются «новвоведения» Java 5 (Generics), а теперь еще и Java 8 (методы в интерфейсах, ссылки на методы, лямбды, Stream API, JSR 308: Pluggable Type Systems). Надо обратить внимание на то, что Generics + Java 8 — это не просто языковые фичи, это частично переход к функциональному стилю программирования.

Я собрал определенное количество полезных (на мой взгляд) ссылок по следующим темам

  1. Методы в интерфейсах, ссылки на методы, множественное наследование
  2. Лямбды (Project Lambda)
  3. Stream API
  4. Функциональные алгоритмы
  5. Аннотации
  6. Генерики
  7. Reflection API
  8. Загрузка классов

Надеюсь кто-то сочтет их полезными.

Детальная информация

  1. Методы в интерфейсах, ссылки на методы, множественное наследование
    • Статические методы в интерфейсах
    • Методы по умолчанию (default methods) в интерфейсах
    • Как жить с множественным наследованием: возможности, разрешение конфликтов
    • Ссылки на методы

  2. Лямбды (Project Lambda)
    • Предыстория, синтаксис лямбд
    • Детали: lexical scope, effectivelly final, closures, type inference, target typing, сериализация лямбд

  3. Stream API
    • Внешняя и внутренняя итерация: map, filter, forEach
    • Более сложные операции: flatMap, reduce, collect
    • Свойства потоков и свойства операций: immediate/terminal, lazy/eager, stateless/stateful, short-circuiting, serial/parallel, ordered/unordered, associative
    • Параллельные Stream-ы и неявная интеграция с Fork/Join

  4. Функциональные алгоритмы
    • Параллельная редукция работает на моноидах (ассоциативностью, нейтральный элемент). Что это значит?
    • Optional, CompletableFuture,… и другие монады. Что это значит?
    • Карринг, функции высшего порядка. Что это значит?
    • Комбинаторные алгоритмы на Java 8

  5. Аннотации
    • Определяем свои аннотации
    • Мета-аннотации: @ Target, @ Retention, @ Inherited, @ Repeatable, ...
    • Аннотации для компилятора: @ Override, @ SafeVarargs,@ SuppressWarnings, @ FunctionalInterface, ...
    • Вычитываем аннотации при помощи Reflection API
    • JSR 308: Type Annotations and Pluggable Type Systems
    • Расширяем проверку типов с помощью Checker Framework: @ NotNull, @ GuardedBy, ...

  6. Генерики
    • Bounded type parameters
    • Self-bounding generics
    • Wildcards
    • Как реализованы в Java, ограничения (type erasure, bridge methods, non-reifiable types)

  7. Reflection API
    • java.lang.reflect
    • Как framework-и используют Reflection API (JUnit, Mockito, Servlet API 3)

  8. Загрузка классов
    • Формат class-файла и процедура загрузки классов (load, link (verify, prepare, resolve), init)
    • ClassLoader: определяем свой загрузчик, строим иерархию загрузчиков
    • Динамическая кодогенерация, компилируем “на лету”: Compiler API, javaassist
    • Динамическая кодогенерация, собираем из байткода: BCEL, cglib
    • Динамическая кодогенерация, трансформация существующего байткода в процессе загрузки классов

Вебинары

5 августа стартует серия из 8-ми вебинаров по темам, указанным выше. Вебинары длятся 2.5-3 часа, в течении которых удается глубоко погрузится в проблематику и детали. Занятия проходят 2 раза в неделю в течении 4-х недель во вторник и пятницу в 18.00-21.00 по московскому времени.
Стоимость
При оплате до 12 июля: 225$.
При оплате до 19 июля: 250$.
При оплате до 26 июля: 275$.
При оплате после 26 июля: 300$.

Контакты

email: GolovachCourses
skype: GolovachCourses

Автор: IvanGolovach

Источник [44]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/java/64146

Ссылки в тексте:

[1] docs.oracle.com: Default Methods: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

[2] oracle.com/JavaTutorial: Method References: http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

[3] Lambda Expressions in Java. Reference (pages 117-124, 135-147): http://www.angelikalanger.com/Lambdas/LambdaReference.pre-release.pdf

[4] docs.oracle.com: Lambda Expressions: http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

[5] Lambda FAQ: http://www.lambdafaq.org/

[6] Java 8: Lambdas, Part 1: http://www.oracle.com/technetwork/articles/java/architect-lambdas-part1-2080972.html

[7] Java 8: Lambdas, Part 2: http://www.oracle.com/technetwork/articles/java/architect-lambdas-part2-2081439.html

[8] Lambda Expressions in Java. Tutorial: http://www.angelikalanger.com/Lambdas/Lambdas.pdf

[9] docs.oracle.com: Aggregate Operations: http://docs.oracle.com/javase/tutorial/collections/streams/index.html

[10] docs.oracle.com: Reduction: http://docs.oracle.com/javase/tutorial/collections/streams/reduction.html

[11] docs.oracle.com: Parallelism: http://docs.oracle.com/javase/tutorial/collections/streams/parallelism.html

[12] javadoc: java.util.stream package description: http://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

[13] State of the Lambda (September 2013): http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html

[14] State of the Lambda: Libraries Edition (September 2013): http://cr.openjdk.java.net/~briangoetz/lambda/lambda-libraries-final.html

[15] Interface evolution via virtual extension methods: http://cr.openjdk.java.net/~briangoetz/lambda/Defender%20Methods%20v4.pdf

[16] What’s Wrong with Java 8: Currying vs Closures: http://java.dzone.com/articles/whats-wrong-java-8-currying-vs

[17] What’s Wrong in Java 8, Part II: Functions & Primitives: http://java.dzone.com/articles/whats-wrong-java-8-part-ii

[18] What’s Wrong in Java 8, Part III: Streams and Parallel Streams: http://java.dzone.com/articles/whats-wrong-java-8-part-iii

[19] What’s Wrong in Java 8, Part IV: Monads: http://java.dzone.com/articles/whats-wrong-java-8-part-iv

[20] What’s wrong in Java 8, part V: Tuples: http://java.dzone.com/articles/whats-wrong-java-8-part-v

[21] What’s wrong in Java 8, part VI: Strictness: http://java.dzone.com/articles/whats-wrong-java-8-part-vi

[22] Жемчужины проектирования алгоритмов. Функциональный подход: http://www.ozon.ru/context/detail/id/19435989/

[23] docs.oracle.com: Annotations: http://docs.oracle.com/javase/tutorial/java/annotations/index.html

[24] Type Annotations Specification (JSR 308): http://types.cs.washington.edu/jsr308/specification/java-annotation-design.pdf

[25] The Checker Framework: http://types.cs.washington.edu/checker-framework/

[26] docs.oracle.com: Generics: http://docs.oracle.com/javase/tutorial/java/generics/index.html

[27] Adding Wildcards to the Java Programming Language: http://www-public.int-evry.fr/~gibson/Teaching/CSC7322/ReadingMaterial/TorgersenETAL04.pdf

[28] Making the future safe for the past: Adding Genericity to the JavaTM Programming Language: http://wwwold.cs.umd.edu/class/spring2001/cmsc433-0201/Lectures/gj-oopsla.pdf

[29] Generics in the Java Programming Language: http://www8.cs.umu.se/kurser/TDBB24/HT05/jem/download/generics-tutorial.pdf

[30] Adding Generics to the Java Programming Language: http://www.it-c.dk/people/kbilsted/kurser/aos2003f/session03/spec8.pdf

[31] Java Generics FAQs: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

[32] Java Generics and Collections: http://www.amazon.com/Java-Generics-Collections-Maurice-Naftalin/dp/0596527756/

[33] docs.oracle.com: The Reflection API: http://docs.oracle.com/javase/tutorial/reflect/

[34] Java Reflection in Action: http://www.amazon.com/Java-Reflection-Action-Ira-Forman/dp/1932394184/

[35] Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages: http://ftp.linux62.org/~glibersat/publis/p331-bracha.pdf

[36] Dynamic Class Loading in the Java Virtual Machine: http://148.206.49.174/coursdea/DynamicClassLoadingInTheJavaVirtualMachine.pdf

[37] Internals of Java Class Loading: http://www.onjava.com/pub/a/onjava/2005/01/26/classloading.html

[38] Inside Class Loaders: http://www.onjava.com/pub/a/onjava/2003/11/12/classloader.html

[39] Inside Class Loaders: Debugging: http://www.onjava.com/pub/a/onjava/2004/06/30/classloader2.html

[40] Java Lang Spec: Loading of Classes and Interfaces: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.2

[41] Java Lang Spec: Linking of Classes and Interfaces: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.3

[42] Java Lang Spec: Initialization of Classes and Interfaces: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.4

[43] Java Lang Spec: Unloading of Classes and Interfaces: http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.7

[44] Источник: http://habrahabr.ru/post/228603/