Java 8 называется самой измененной версией в истории Java. Он содержит много важных новых функций, наиболее ядро - добавление выражений Lambda и Streamapi. Эти два также могут быть использованы вместе. Во -первых, давайте посмотрим на то, что является выражением Lambda.
Использование выражений Lambda не только делает код простым, но и читаемым, и, что наиболее важно, количество кода также сильно уменьшается. Однако в некоторой степени эти функции широко использовались на языках JVM, таких как Scala.
Неудивительно, что сообщество Scala невероятно, потому что много контента Java 8 выглядит так, как будто оно было перемещено из Scala. В некоторой степени синтаксис Java 8 более подробный, но не очень ясен, чем Scala, но это не так много, и если это возможно, это может создать Lambda выражения, как это делает Scala.
С одной стороны, если Java продолжает разрабатывать и реализовать функции, которые Scala уже реализовала вокруг Lambda, то Scala может не понадобиться. С другой стороны, если он предоставляет только некоторые основные функции, такие как помощь анонимным внутренним классам, Scala и другие языки будут продолжать процветать и могут обогнать Java. На самом деле, это лучший результат. Только с конкуренцией может быть прогресс. Другие языки продолжают развиваться и расти, и нет необходимости беспокоиться о том, будут ли они устарели.
Выражение Lambda, объяснение в Википедии является оператором, используемым для представления анонимных функций и закрытия. Я чувствую, что это объяснение все еще очень абстрактно. Давайте посмотрим на пример.
открытый класс SwingTest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); Jbutton jbutton = new jbutton ("my jbutton"); jbutton.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {System.out.println ("Кнопка нажата!");}}); jframe.add (jbutton); jframe.pack (); jframe.setvisible (true); jframe.setDefaultCloseoPeration (jframe.exit_on_close); }}Это кусок кода в программировании Swing, который связывает событие прослушивания с кнопкой. Когда кнопка нажимается, содержимое «Наготовится!» будет выводиться на консоли. Здесь мы создаем экземпляр анонимного внутреннего класса, чтобы привязаться к слушателю, который также является относительно распространенной формой организации кода в прошлом. Но если мы посмотрим внимательно, мы обнаружим, что на самом деле мы действительно сосредотачиваемся, это параметр e типа ActionEvent и System. вывод в консоли.
Если код в предыдущей программе, который создает анонимный внутренний класс, заменяется выражением Lambda, код выглядит следующим образом
открытый класс SwingTest {public static void main (string [] args) {jframe jframe = new jframe ("my jframe"); Jbutton jbutton = new jbutton ("my jbutton"); jbutton.addactionListener (e -> system.out.println ("нажатая кнопка!")); jframe.add (jbutton); jframe.pack (); jframe.setvisible (true); jframe.setDefaultCloseoPeration (jframe.exit_on_close);}} Обратите внимание на изменения в средней части кода, из исходных 6 строк кода, теперь 1 строка может быть реализована. Это простая форма выражения Lambda.
Видно, что синтаксис выражения лямбды
(param1, param2, param3) -> {// todo}Типовая программа параметра здесь может быть выведена на основе контекста, но не все типы могут быть выведены. В настоящее время нам нужно отобразить объявленный тип параметра. Когда есть только один параметр, кронштейны могут быть опущены. Когда часть Todo имеет только одну строку кода, брекеты снаружи могут быть опущены. Как в нашем примере выше
Итак, в дополнение к краткому коду, Lambda Expression приносит нам какие -либо изменения?
Давайте напомним, что в Java мы не можем передать функцию в качестве параметра методу, и мы не можем заявить, что возвратное значение является методом функции. Перед Java 8 ответ был да.
Таким образом, в приведенном выше примере мы можем на самом деле передать часть логики кода в качестве параметра слушателю, сообщив слушателю, что вы можете сделать это, когда событие запускается, без необходимости использовать анонимные внутренние классы в качестве параметров. Это также еще одна новая функция, представленная Java 8: функциональное программирование.
Есть много языков, которые поддерживают функциональное программирование. В JavaScript очень распространено передавать функции в виде параметров или возвращающих значений в качестве функций. JavaScript - очень распространенный функциональный язык.
Lambda добавляет отсутствующие функции функционального программирования в Java, позволяя нам рассматривать функции как первоклассных граждан.
В языках функционального программирования тип выражения Lambda является функцией. В Java выражения Lambda являются объектами, и они должны быть прикреплены к специальному объекту - функциональный интерфейс.
Далее, давайте посмотрим на определение функционального интерфейса:
Если в интерфейсе есть только один абстрактный метод (методы в классе объекта не включены), то этот интерфейс может рассматриваться как функциональный интерфейс.
@FunctionalInterfacepubbublic interface runnable {/** * Когда используется объект, реализующий интерфейс <code> runnable </code> * Для создания потока, запуск потока вызывает * <code> running </code> метод, который будет вызван в этом отдельном выполнении * потоке. * <p> * Генеральный контракт метода <code> запустить </code>, что он может * предпринять любое действие. * * @see java.lang.thread#run () */ public abstract void run ();}Давайте посмотрим на утверждение запускаемого интерфейса. После Java 8, выполняемый интерфейс имеет дополнительную функциональную аннотацию, указывая, что интерфейс является функциональным интерфейсом. Однако, если мы не добавляем аннотацию функциональной сети, если есть и только один абстрактный метод в интерфейсе, компилятор также будет рассматривать интерфейс как функциональный интерфейс.
@FunctionalInterfacepubbublic interface myInterface {void test (); String toString ();}MyInterface также является функциональным интерфейсом, потому что ToString () является методом в классе объекта, но он здесь перезаписывается и не увеличит количество абстрактных методов в интерфейсе.
(Чтобы упомянуть здесь, в Java 8 методы в интерфейсе могут иметь не только абстрактные методы, но и иметь конкретные реализованные методы. Они называются методами по умолчанию, которые будут подробно введены позже)
Поскольку в Java выражения Lambda являются объектами. Итак, что такое тип этого объекта? Давайте рассмотрим программу SwingTest, где экземпляр интерфейса ActionListener создается в анонимном внутреннем классе.
jbutton.addactionListener (new ActionListener () {@Override public void actionPerformed (actionEvent e) {System.out.println ("Кнопка нажата!");}});Улучшено с выражением Lambda
jbutton.addactionListener (e -> system.out.println ("нажатая кнопка!"));То есть мы используем Lambda Expression для создания экземпляра интерфейса ActionListener, а затем рассмотрим определение интерфейса ActionListener.
Общедоступный интерфейс ActionListener EventListener { /*** вызывается, когда происходит действие. */ public void actionperformed (actionEvent e);} Есть только один абстрактный метод. Хотя аннотация функциональности не добавлена, она также соответствует определению функционального интерфейса. Компилятор будет считать это функциональным интерфейсом.
Следовательно, использование выражений Lambda может создавать экземпляры функциональных интерфейсов. То есть выражение лямбда возвращает функциональный тип интерфейса.
Фактически, существует три способа создания экземпляров функциональных интерфейсов (см. Функциональную аннотацию):
1. Lambda выражения
2. Метод цитата
3. Ссылка на метод конструктора
Суммировать
Выше приведено в этой статье о простом понимании Java 8 выражений Lambda и функциональных интерфейсов. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это!