Интерфейс ExecutorService отделяет отправку задачи на выполнение от непосредственно самого выполнения. По сравнению с использованием потоков и интерфейсом Runnable удобно то, что с помощью
Потоковые операции, допускающие соединение в цепочку, называются промежуточными (intermediate), а закрывающие поток данных операции — завершающими (terminal).
Stream API Java 8 позволяет писать код:
• декларативный — более лаконичный и удобочитаемый;
• удобный для компоновки — более гибкий;
• параллелизуемый — более производительный.
В результате в Java существует механизм преобразования примитивных типов данных в соответствующие ссылочные типы. Этот механизм называется упаковкой (boxing). Обратный процесс (преобразование ссылочного типа данных в соответствующий примитивный тип) называется распаковкой (unboxing). В Java существует также механизм автоупаковки (autoboxing) для упрощения работы программистов: упаковка и распаковка производятся автоматически.
Напомним: все типы данных Java делятся на ссылочные (например, Byte, Integer, Object, List) и примитивные (простые) типы (например, int, double, byte, char).
Запомните: благодаря лямбда-выражениям можно непосредственно на месте задать реализацию абстрактного метода функционального интерфейса и работать с выражением в целом как с экземпляром функционального интерфейса.
В двух словах, функциональный интерфейс (functional interface) — интерфейс, в котором описывается ровно один абстрактный метод. Вы уже знакомы с несколькими функциональными интерфейсами из API Java, такими как Comparator и Runnable, о которых мы говорили в главе 2:
Ссылки на методы можно рассматривать как «синтаксический сахар» для лямбда-выражений, поскольку с их помощью можно писать меньше кода для выражения того же самого.
С помощью ссылок на методы можно переиспользовать существующие определения методов и передавать их подобно лямбда-выражениям. В некоторых случаях они оказываются более удобочитаемыми и выглядят естественнее, чем лямбда-выражения.