Лямбда-выражения в Java 8: как использовать примеры
Опубликованно 02.11.2018 17:21
Каждый разработчик должен узнать, как использовать новые функции программирования, особенно сейчас, когда 8 версия достигла максимального пика использования. Лямбда-выражение-это новая и важная функция в том числе в Java 8. Он обеспечивает четкий и краткий способ представления метода, который улучшает Collection библиотеки, что облегчает повторение, фильтрации и извлечения данных. Новые возможности для параллелизма, для улучшения производительности в средах, multi-core. Принцип лямбда-выражения
Несколько лет назад специалисты обсудили вопрос расширения языка Java, функциональное программирование. В 2009 году, стало ясно, что Java без лямбды будет выглядеть устаревшим в сравнении с другими языками программирования, потому что современное ядро для многопроцессорных и многоядерных компьютере требуется простая поддержка распараллеливания программ. Вот зачем нужны лямбда-выражения.
В Java все коллекции имеют метод forEach, он наследует от super-интерфейс Iterable. Существует, еще со времен Java 5 был расширен до 8-й версии. Метод forEach перебирает все элементы коллекции, и применяет функцию к каждому элементу.
Лямбда-выражение-это анонимная функция, которая обеспечивает возможность параметризации поведения. Содержит список возвращаемых параметров и исключения, которые выбирают. Экземпляр лямбда-выражения в Java может быть назначен любой Iterable, соответствующее определение, при условии, что он является функциональным.
Важные моменты для понимания лямбда-выражения: Элемент слева от стрелки ( - > ) являются значения лямбда. В этом случае входной параметр определяется как String param. Справа от стрелки (->) - тела лямбда-выражения. Тело-это место, где происходит обработка лямбды, то есть, определяет его логику. Как правило, лямбда-выражения Java это простая логика.
Синтаксис параметры из списка
Есть несколько синтаксических параметров из списка. Вот упрощенная версия синтаксис лямбда-выражений: LambdaExpression. LambdaParameters '->' LambdaBody LambdaParameters. Identifier '(' ParameterList ')' LambdaBody. Expression Block.
Список параметров-это список с разделителями-запятыми, скобками или идентификатор без скобок. Если используется рту списка необходимо решить, если прописан тип параметра для всех, или если не указан, то автоматически определяется компилятором. Вот некоторые примеры лямбда-выражений в Java:
(int x) -> x + 1
Список параметров и с единственным параметром, с помощью спецификации типа
int x -> x + 1
Ложь, если указан тип параметра, используются круглые скобки
(x) -> x + 1
Список параметров с единственным вариантом, без явной спецификации типа, компилятор выводит, что отсутствует параметр типа контекста
x -> x + 1
Список параметров с единственным вариантом, без явной спецификации типа. В этом случае опускают скобки
(int x, int y) -> x + y
Список параметров с двумя параметрами n с спецификацией типа
int x, int y -> x + y
Ложь, если задан тип значения, вы должны использовать круглые скобки
(x, y) -> x + y
Список параметров с двумя параметрами, без явной спецификации типа
x, y -> x + y
Ложь, для более чем одного параметра, нужно использовать скобки
(x, int y) -> x + y
Поддельные, вы не можете смешивать параметры типа и без него. Все они имеют четкое указание типа или не
() -> 42
Список может быть пустым
Тело лямбда-выражение или список выражений в скобках. Вот некоторые примеры лямбда-выражений в Java:
() -> System.gc ()
Тело состоит из одной инструкции
(String [] args)
-> (args! = = null) ? args.length : 0
Оператор также возвращает выражение
(String [] args)
-> {if (args! = = null)
return args.length ;
еще
return 0 ;
}
Здесь используются ключи, потому что это оператор, а не выражение
(int x) -> x + 1
Тело лямбда-выражения.
(int x) -> return x + 1
Ложь, начинается с возвращения одобрения, и лямбда не, return должен заканчиваться точкой с запятой и быть в скобках
(int x) -> { return x + 1 ; }
Правильно
Выражение только отображается в исходный код в местах, где существует контекст вывода, который может решить компилятор. Таким образом, лямбда, допускаются только в следующих местах: В правой части присваивания; в зависимости от аргументов метода при вызове; как значение предложения возврата; на всю важность. Функциональные интерфейсы
8-версии принес мощный синтаксис улучшение в виде выражения. Ранее, как правило, создал класс, чтобы каждый раз, когда это было необходимо инкапсулировать одной функции.
Для всех интерфейсов, рекомендуется иметь хорошее нападение. Это не только четко объясняет свою цель, но также обеспечивает то, что компилятор будет генерировать ошибку, если записанный интерфейса не соответствует условиям СЭМ. Интерфейс Single Abstract Method является функциональной, а ее реализация может рассматриваться, перед тем, как использовать лямбда-выражения в Java 8.
Методы изначально не абстрактные и не имеют в виду, и интерфейс пользователя по-прежнему может иметь несколько методов по умолчанию. Можно наблюдать, глядя на документацию по Функции. Самый простой и распространенный случае лямбда-выражение-это функциональный интерфейс с методом, который принимает значение, вернуть в другой. Эта функция аргумента приводится интерфейса Function, что параметры, типы аргументов и возвращаемых значений. Примеры-лямбда-выражения в Java: 1; public interface Function { ... }. Анонимный внутренний класс
В Java анонимные внутренние классы позволяют реализовать классы, которые можно найти в приложении только один раз. Например, в стандартном приложении Swing или JavaFX требует несколько обработчиков событий клавиатуры и мыши. Вместо того, чтобы писать отдельный класс для каждого события, назначают в общем порядке. При создании класса в месте, где это необходимо, код читать намного легче.
Не удается правильно понять, что такое лямбда-выражения, не рассмотрев функциональные возможности интерфейсов. Использование своих анонимных внутренних классов-это общий шаблон в Java. Кроме EventListener классы, интерфейсы, как Runnable, Comparator используются аналогичным образом. Таким образом, функциональные возможности, интерфейсы, специально используются с лямбда-выражениями.
Выражение анонимной функции
В целом, Lambda Expression - краткое изложение анонимная функция, которая может быть передана. Таким образом, она имеет следующие свойства:
Анонимность, потому что не имеет, как обычно, явного имени. Функциональности можно рассматривать как функцию, потому что лямбда не связан с классом, как метод. Но так же, как и метод, лямбда имеет список параметров, тело, тип возврата и список исключений, которые могут быть выбраны. Шаг, лямбда-выражение может передаваться в качестве аргумента в метод, или храниться в переменной. Скорее, не надо писать много шаблонов, как для анонимных классов. Технически Лямбда-выражения позволяют делать то, что не сделали до Java 8, кроме того, теперь вам не придется писать тупой код для использования параметризации поведения. Список параметров. В этом случае он отражает параметры метод сравнения компаратора - два объекта Apple. Стрелку " ->" отделяет список параметров тела лямбда-выражения. Выражение считается возвращаемое значение лямбда-выражения. Синтаксис выражения
Лямбда-выражения, определяют объем анонимных внутренних классов путем преобразования 5 строк кода на одного оператора. Это простое горизонтальное решение позволяет "книжная проблемы", представленной внутри классов. Лямбда-выражения состоит из 3 частей.
Тело может быть независимое выражение, или блок управления. В форме выражения тела просто вычисляется и возвращается. В блоке формируется тело оценивается как тело метода, и оператор return возвращает управление вызывающей анонимного метода. На верхнем уровне break continue ключевые слова являются незаконными, но разрешены в течение циклов. Если тело производит результат, каждый путь управления должен возвращать что-то или генерировать исключение.
Например: (int x, int y) -> x + y; () -> 42; (String s) -> {System.out.println (s); }.
Первое выражение принимает два целочисленных аргумента, называемых x и y, и используется как способ выражения, чтобы вернуться x + y. Второй не принимает аргументов, и использует форму для возврата целое число 42. Третье выражение, которое принимает строку и использует форму диска для печати команд в консоли и ничего не возвращает. Защита переменных объекта от мутации
Доступ к переменной в лямбда-выражение, возникнет ошибка во время компиляции. Но это не означает, что пользователь должен набрать в каждой целевой переменной, как окончательный. В соответствии с концепцией "сделано в финал", компилятор анализирует каждой переменной, как и конец, если назначается более одного раза.
Безопасно использовать эти переменные в лямбда-выражения, поскольку компилятор контролировать свое состояние и при запуске ошибка времени компиляции, сразу после любой попытки изменить. Этот подход должен упростить процесс выполнения лямбда-выражения для выполнения. Одной из основных задач лямбда-выражения является использование параллельных вычислений, что означает, что они действительно полезны, когда речь идет о безопасности потоков.
Это хороший конец парадигмы помощи, многие, но не в каждом случае. Лямбда-выражения не может изменять значение объекта, которое охватывает область. Но в случае переменные состояния объекта может быть изменено внутри лямбда-выражения. Этот код является законным, поскольку полная переменная остается, действительно, конец. Захват переменной экземпляра
Лямбда-выражение, которое также может захватить переменной экземпляра объекта, который создается лямбда. Вот пример, который показывает, процесс.
Обратите внимание, что ссылка this.name внутри лямбды тела. Это подтверждает name переменную экземпляра EventConsumerImpl объекта. Можно даже изменить значение переменной экземпляра после его захвата, и его значение будет отображено внутри лямбда-выражения. Семантика this является на самом деле одной из областей, где Java лямбды отличается от анонимного реализации интерфейсов. Реализация анонимного интерфейса может иметь свои собственные переменные экземпляра, на который ссылается ссылка this. Тем не менее, лямбда не может иметь свои собственные переменные экземпляра, таким образом, this всегда указывает на то, что охватывает объект.
Захвата статической переменной Почему это выражение Java, также можно записывать статические переменные. Это не удивительно, потому что статические переменные доступны везде, где есть Java-приложения. Значение статической переменной можно также изменить после того, как лямбда на рубашку. Класс в первую очередь служит, чтобы показать, что лямбда может получить доступ к статической переменной. Ссылки на методы
В случае, когда все лямбда-выражения относятся к методам , должен вызывать другой метод с параметрами, переданными лямбда, реализации лямбда-выражения в Java предоставляет более короткий способ выражения вызова метода. Вот, например, функциональный интерфейс
Потому, что тело лямбда-выражения состоит только из одного утверждения, можно фактически снизить, внесенные { } в нем. Кроме того, поскольку для данного метода, есть только один вариант, вы можете пропустить сопровождают ( ) скобки вокруг параметра. Вот как выглядит итоговая декларация лямбда: Myprinter myprinter = s -> System.out.println (s);
Так, что все тело лямбда делает, передает строковое значение в системе.out.println() метод, вы можете заменить старый лямбда-объявление ссылка на метод.
Вот как выглядит ссылка на метод lambda: Myprinter myprinter = System.out :: println.
Необходимо обратить особое внимание на двойное двоеточие ::. Этот сигнал компилятору Java-это ссылка на метод. Метод-это то, что происходит после кавычки. Независимо от класса или объекта, которому принадлежит метод. Типичные примеры использования
Смещение Лямбда.
В обоих случаях параметр не передается и возвращается. Runnable лямбда-выражение, которое используется формат блока, преобразует пять строк кода в одной инструкции.
Приемник Lambda.
Выражение лямбды передается в качестве параметра. Судьба их классификации используется в различных контекстах, в том числе следующее: Переменные творчества. Назначение операторов возврата. Инициализаторы массива. Аргументы метода или конструктора. Лямбда-выражения. Условные выражения. Выражение компаратор лямбда-выражения В Java.
Comparator класс используется для классификации коллекций. В следующем примере выполняется сортировка ArrayList состоит из Person объектов на основе фамилии. Ниже перечислены поля, включенные в класс Person. Лямбда поддерживает "назначение" преобразование типов", которое указывает тип объекта контекста, в котором используется. Потому, что присваивается результат Comparator с помощью generic, компилятор может сделать вывод, что оба параметра имеют Person тип.
Рекомендации по предоставлению целевых типов
Метод является общим и абстрактным, что позволяет легко адаптироваться практически к любой лямбда. Разработчики должны рассмотреть этот пакет, прежде чем создавать новые интерфейсы. Скачать лямбда-выражения в Java 8 pdf в Интернете.
В какой класс UseFoo принимает этот интерфейс в качестве параметра. Если посмотреть выражение ближе, то можно увидеть, что Foo - это не что иное, как функция, которая принимает один аргумент и дает результат. 8-версии уже предоставляет интерфейс функции. Можно полностью удалить интерфейс Foo и изменить код, собственный голос выражения.
Подход лямбда-выражения можно использовать для любой правильный интерфейс старых библиотек. Можно использовать для интерфейсов, как Runnable, Comparator и другие. Тем не менее, это не означает, что пользователь должен просмотреть большую базу кода, и все изменить.
Рекомендуется избегать способов перегрузки функциональных интерфейсов в качестве параметров, и использовать их с разными именами, чтобы избежать столкновений. Не стоит относиться к лямбда-выражения, как внутри классов, так как создается новая область. Можно перезаписать переменные, которые охватывают области, путем создания новых локальных переменных с таким же именем и использовать ключевое слово this внутри класса, как ссылка на экземпляр.
Тем не менее, лямбда-выражения работают с охватывающей области и не можете перезаписать переменные, из которых охватывает пространство внутри тела лямбда-выражения. В данном случае, ключевое слово, это относится к защите экземпляр.
Лямбда-выражения, создаются короткие и легкие для понимания, желательно использовать строчные дизайн вместо большого блока кода. Необходимо помнить, что лямбда-выражение должно быть выражением, и не повествование. Несмотря на сжатый синтаксис этих выражений, следует точно выразить, возможности, которые они предоставляют. Это, в основном, стилистические, Совет, который не влияет на производительность.
Тем не менее, пользователь не должен использовать это правило "учение " лямбда", как догма. Если у вас есть две или три строки, на определение лямбда-выражение, не может быть выполнен, привести их в одной строке. И также необходимо избегать указания типов параметров. Компилятор в большинстве случаев, способен разрешить тип лямбда-параметров с помощью вывода типа, так что добавление одного типа параметров является необязательным и может быть опущен.
Синтаксис лямбда-выражения, необходимо заключить в скобки только около более одного параметра, или, когда нет никаких параметров. Вот почему это безопасно сделать код немного короче, и удалить скобки, когда есть только один вариант. Рекомендации по составлению лямбда-выражения Java для начинающих, вы можете найти в Интернете.
Операций, круглые скобки, и возврата не являются обязательными в два лямбда тела. Это означает, что могут быть опущены для ясности и краткости. Очень часто лямбда-выражения, просто вызывают методы, которые были применены в другом месте. В этой ситуации очень полезно использовать другую функцию - ссылки на методы. Это не всегда самый короткий, но делает код более читабельным.
Лямбда-выражения, они работают очень хорошо вместе, только с интерфейсами в Java 8. Вы не можете использовать лямбда-выражение, с интерфейсом, с более абстрактный метод. Для работы с эти выражения, необходимо убедиться, что у пользователя установлена восьмая версия Java. Лямбда-выражения не работают в Java 7 и более ранних версий. Автор: Иван Фролов 12 Октября 2018 года
Категория: Мобильная техника