- Русские Блоги
- [Java функциональное программирование 02] лямбда-выражение и двойное двоеточие
- Java лямбда-выражение
- 0 Подведём итог:
- 1 Что такое лямбда-выражение?
- 3 Синтаксис?
- 4 how?
- 5 Резюме
- 6 Двойная функция двоеточия:
- Интеллектуальная рекомендация
- Преобразования общих типов для передачи данных по протоколу iOS-TCP / IP (приветствуются дополнения
- Lotus версия 0.4.1 Данные цепочки блока Copy Block снижает синхронизацию
- Маленькая программа wx: ограничение количества списков цикла for
- Шантажировал биткойн впервые
- Оператор двойного двоеточия в Java 8
- 1. Обзор
- 2. От лямбд к оператору двойного двоеточия
- 3. Как это работает?
- 4. Ссылки на методы
- 4.1. Статический метод
- 4.2. Метод экземпляра существующего объекта
- 4.3. Метод экземпляра произвольного объекта определенного типа
- 4.4. Супер метод конкретного объекта
- 5. Ссылки на конструкторы
- 5.1. Создать новый экземпляр
- 5.2. Создать массив
- 6. Заключение
- Оператор двойного двоеточия в Java 8
- 1. Обзор
- Дальнейшее чтение:
- Вопросы для интервью Java 8(+ Ответы)
- Руководство По Java 8 Необязательно
- Новые функции в Java 8
- 2. От Лямбды к оператору двойного двоеточия
- 3. Как Это Работает?
- 4. Ссылки на методы
- 4.1. Статический метод
- 4.2. Метод экземпляра существующего объекта
- 4.3. Метод экземпляра Произвольного объекта Определенного типа
- 4.4. Супер-метод конкретного объекта
- 5. Ссылки на конструкторы
- 5.1. Создайте новый экземпляр
- 5.2. Создайте массив
- 6. Заключение
- :: (двойное двоеточие) оператор в Java 8
Русские Блоги
[Java функциональное программирование 02] лямбда-выражение и двойное двоеточие
Java лямбда-выражение
0 Подведём итог:
- Лямбда-выражения являются проявлением парадигмы функционального программирования на Java: реализация одного класса или интерфейса метода напрямую рассматривается как непосредственно определяемый функциональный метод, который улучшает читаемость и уменьшает объем кода в более компактной и лаконичной форме;
- Лямбда-выражения позволяют более компактно выражать экземпляры классов с одним методом. (Это описание перевода официального документа);
- Функция двойного двоеточия: если внутренняя реализация лямбда-выражения представляет собой один класс методов и имеет ту же форму входных параметров, что и интерфейс реализации, используйте двойное двоеточие: [имя класса (имя экземпляра класса) :: имя метода] для дальнейшего упрощения связанных выражений;
1 Что такое лямбда-выражение?
Лямбда-выражения, также известные как замыкания, являются наиболее важными новыми функциями, стимулирующими выпуск Java 8.
Лямбда допускает функции как параметры метода (функции передаются в методы как параметры).
Лямбда-выражения позволяют вам делать это, рассматривая функции как параметры метода или код как данные.
Лямбда-выражения позволяют более компактно выражать экземпляры классов с одним методом, а лямбда-выражения позволяют более компактно выражать экземпляры классов с одним методом.Класс одного методаПримеры.
- Улучшить читаемость;
- Уменьшить объем кода, сделать его более сжатым и компактным;
3 Синтаксис?
- Разделенный запятыми список формальных параметров, заключенный в круглые скобки, Разделенный запятыми список параметров в круглых скобках;
- The arrow token, -> Знак стрелки
- Тело, состоящее из одного выражения или блока операторов. Тело, состоящее из одного выражения или блока операторов.
- Если вы укажете одно выражение, среда выполнения Java оценит выражение и вернет его значение. Кроме того, вы можете использовать оператор возврата.
- Если целевой тип лямбда-выражения и его захваченные параметры являются сериализуемыми, вы можете сериализовать его. Однако, как и для внутренних классов, настоятельно рекомендуется не сериализовать лямбда-выражения.
4 how?
5 Резюме
- В лямбда-интерфейсе callable и runnable есть только один метод, а именно run и call, которые не содержат входных параметров, и все лямбад-выражения не имеют входных параметров, если только вы сами не определите входные параметры, но call поддерживает return, что также является его характеристикой;
- лямбда-выражения подходят дляКласс с одним методом, то есть реализация интерфейса с одним методом;
6 Двойная функция двоеточия:
Двойное двоеточие — это упрощенная форма лямбда-выражения. Когда функция реализации лямбда-выражения имеет тот же номер или форму, что и параметры других статических классов или классов реализации, выражение можно упростить с помощью
Имя класса (имя экземпляра класса) :: имя метода
Выражение можно упростить, оно эквивалентно ссылке на закрытие метода;
Интеллектуальная рекомендация
Преобразования общих типов для передачи данных по протоколу iOS-TCP / IP (приветствуются дополнения
Раньше я работал над проектами TCP / IP. Обработка данных является наиболее сложной задачей. Каждый раз, когда встречается новый тип данных, добавляется новый класс методов, что приводит к путанице. С.
Lotus версия 0.4.1 Данные цепочки блока Copy Block снижает синхронизацию
Lotus версия Скопируйте данные с узла, который был синхронизирован высотой блока Узел паузыlotus daemonБеги, сжатый каталогdatastoreПуть кlotus/datastore Копировать каталогchainс участиемmetadataЗамен.
Маленькая программа wx: ограничение количества списков цикла for
Все мы знаем, что wx: for используется для зацикливания массива. В этом цикле будут зациклены все данные в списке. Но часто нам не нужно зацикливать все данные или мы не хотим отображать все данные. О.
Шантажировал биткойн впервые
Предисловие Новости о вымогателях всегда случались, но я всегда чувствую, что это вряд ли случится со мной. В итоге я встретился сегодня. проблема Во второй половине дня я отправлю интерфейс студентам.
Источник
Оператор двойного двоеточия в Java 8
1. Обзор
В этой быстрой статье мы обсудим оператор двойного двоеточия ( ::) в Java 8 и рассмотрим сценарии, в которых этот оператор может использоваться.
2. От лямбд к оператору двойного двоеточия
Мы увидели, что с помощью лямбда-выражений код может стать очень кратким.
Например, для создания компаратора достаточно следующего синтаксиса:
Затем с выводом типа:
Но можем ли мы сделать приведенный выше код еще более выразительным и читаемым? Давайте посмотрим:
Мы использовали оператор :: как сокращение для лямбда-выражений, вызывающих определенный метод — по имени. И, в конце концов, результат, конечно же, еще более читаемый синтаксис.
3. Как это работает?
Проще говоря, когда мы используем ссылку на метод — целевая ссылка помещается перед разделителем . а имя метода указывается после него.
Мы смотрим на ссылку на метод getAge, определенный в классе Computer .
Затем мы можем работать с этой функцией:
Обратите внимание, что мы ссылаемся на функцию, а затем применяем ее к нужному типу аргумента.
4. Ссылки на методы
Мы можем эффективно использовать этот оператор в некоторых сценариях.
4.1. Статический метод
Во-первых, мы собираемся использовать статический служебный метод :
4.2. Метод экземпляра существующего объекта
Далее давайте рассмотрим интересный сценарий — обращение к методу существующего экземпляра объекта .
Мы собираемся использовать переменную System . out — объект типа PrintStream, который поддерживает метод печати :
4.3. Метод экземпляра произвольного объекта определенного типа
Как видите, мы ссылаемся на метод turnOnPc не на конкретный экземпляр, а на сам тип.
В строке 4 будет вызван метод экземпляра turnOnPc для каждого объекта инвентаризации .
И это, естественно, означает, что — для c1 метод turnOnPc будет вызываться на экземпляре компьютера, а для c2 — на экземпляре MacbookPro .
4.4. Супер метод конкретного объекта
Предположим, у вас есть следующий метод в суперклассе Computer :
и этот в подклассе MacbookPro :
Вызов calculateValue метода на MacBookPro например:
также вызовет метод calculateValue в суперклассе Computer .
5. Ссылки на конструкторы
5.1. Создать новый экземпляр
Ссылка на конструктор для создания экземпляра объекта может быть довольно простой:
Что делать, если у вас есть два параметра в конструкторе?
Если параметров три или более, вам необходимо определить новый функциональный интерфейс:
Затем инициализируйте свой объект:
5.2. Создать массив
Наконец, давайте посмотрим, как создать массив объектов Computer из пяти элементов:
6. Заключение
Как мы начинаем видеть, оператор двойного двоеточия, представленный в Java 8, будет очень полезен в некоторых сценариях, особенно в сочетании с Streams.
Также очень важно взглянуть на функциональные интерфейсы, чтобы лучше понять, что происходит за кулисами.
Полный исходный код этого примера доступен в этом проекте GitHub — это проект Maven и Eclipse, поэтому его можно импортировать и использовать как есть.
Источник
Оператор двойного двоеточия в Java 8
Краткое руководство по оператору двойного двоеточия в Java 8 и тому, как его следует использовать на практике.
Автор: baeldung
Дата записи
1. Обзор
В этой краткой статье мы обсудим оператор с двойным двоеточием ( :: ) в Java 8 и рассмотрим сценарии, в которых может использоваться оператор.
Дальнейшее чтение:
Вопросы для интервью Java 8(+ Ответы)
Руководство По Java 8 Необязательно
Новые функции в Java 8
2. От Лямбды к оператору двойного двоеточия
С помощью лямбда-выражений мы видели, что код может стать очень кратким.
Например, для создания компаратора достаточно следующего синтаксиса:
Затем с выводом типа:
Но можем ли мы сделать приведенный выше код еще более выразительным и читабельным? Давайте посмотрим:
Мы использовали оператор :: в качестве сокращения для лямбд, вызывающих определенный метод – по имени. И конечным результатом, конечно, является еще более читаемый синтаксис.
3. Как Это Работает?
Очень просто, когда мы используем ссылку на метод – целевая ссылка помещается перед разделителем :: , а имя метода указывается после него.
Мы смотрим на ссылку метода на метод getAge , определенный в классе Computer .
Затем мы можем работать с этой функцией:
Обратите внимание, что мы ссылаемся на функцию, а затем применяем ее к правильному аргументу.
4. Ссылки на методы
Мы можем хорошо использовать этот оператор в некоторых сценариях.
4.1. Статический метод
Во-первых, мы собираемся использовать статический метод утилиты :
4.2. Метод экземпляра существующего объекта
Далее давайте рассмотрим интересный сценарий – ссылка на метод существующего экземпляра объекта .
Мы будем использовать переменную System . out – объект типа PrintStream , который поддерживает метод print :
4.3. Метод экземпляра Произвольного объекта Определенного типа
Как вы можете видеть, мы ссылаемся на метод turn On Pc не на конкретный экземпляр, а на сам тип.
В строке 4 метод экземпляра turn On Pc будет вызываться для каждого объекта inventory .
И это, естественно, означает, что – для c1 метод turnOnPc будет вызван на экземпляре Computer , а для c2 на экземпляре MacBookPro .
4.4. Супер-метод конкретного объекта
Предположим, у вас есть следующий метод в суперклассе Computer :
и этот в Macbook Pro подклассе:
Вызов метода calculate Value на экземпляре Macbook Pro :
также вызовет также вызов calculate Value на компьютере суперклассе.
5. Ссылки на конструкторы
5.1. Создайте новый экземпляр
Ссылка на конструктор для создания экземпляра объекта может быть довольно простой:
Что делать, если у вас есть два параметра в конструкторе?
Если параметров три или более, необходимо определить новый функциональный интерфейс:
Затем инициализируйте свой объект:
5.2. Создайте массив
Наконец, давайте посмотрим, как создать массив Computer объектов с пятью элементами:
6. Заключение
Как мы начинаем видеть, оператор двойного двоеточия, введенный в Java 8, будет очень полезен в некоторых сценариях, особенно в сочетании с потоками.
Также очень важно взглянуть на функциональные интерфейсы, чтобы лучше понять, что происходит за кулисами.
Полный исходный код для примера доступен в этом проекте GitHub – это проект Maven и Eclipse, поэтому его можно импортировать и использовать как есть.
Источник
:: (двойное двоеточие) оператор в Java 8
Я изучал исходный код Java 8 и нашел эту часть кода очень удивительной:
Это Math::max что-то вроде указателя на метод? Как обычный static метод конвертируется в IntBinaryOperator ?
Обычно, reduce метод вызывается Math.max(int, int) следующим образом:
Это требует много синтаксиса для просто вызова Math.max . Вот где в игру вступают лямбда-выражения. Начиная с Java 8 разрешено делать то же самое гораздо более коротким способом:
Как это работает? Компилятор Java «обнаруживает», что вы хотите реализовать метод, который принимает два int s и возвращает один int . Это эквивалентно формальным параметрам одного-единственного метода интерфейса IntBinaryOperator (параметр метода, который reduce вы хотите вызвать). Таким образом, компилятор сделает все остальное за вас — он просто предполагает, что вы хотите реализовать IntBinaryOperator .
Но поскольку Math.max(int, int) сам выполняет формальные требования IntBinaryOperator , он может быть использован напрямую. Поскольку в Java 7 отсутствует синтаксис, позволяющий передавать сам метод в качестве аргумента (вы можете передавать только результаты метода, но не ссылки на метод), :: синтаксис был введен в Java 8 для ссылки на методы:
Обратите внимание, что это будет интерпретироваться компилятором, а не JVM во время выполнения! Хотя он генерирует разные байт-коды для всех трех фрагментов кода, они семантически равны, поэтому последние два можно считать короткими (и, вероятно, более эффективными) версиями IntBinaryOperator реализации выше!
:: называется Ссылка на метод. Это в основном ссылка на один метод. Т.е. это относится к существующему методу по имени.
Краткое объяснение :
Ниже приведен пример ссылки на статический метод:
square может передаваться как ссылки на объекты и запускаться при необходимости. На самом деле, его можно использовать так же легко, как и ссылку на «нормальные» методы объектов, так же как static и их. Например:
Function выше функциональный интерфейс . Чтобы полностью понять :: , важно понимать и функциональные интерфейсы. Проще говоря, функциональный интерфейс — это интерфейс только с одним абстрактным методом.
Примеры функциональных интерфейсов включают в себя Runnable , Callable и ActionListener .
Function выше , представляет собой функциональный интерфейс только с одним методом: apply . Он принимает один аргумент и дает результат.
Причина, по которой :: это здорово, заключается в том, что :
Ссылки на методы — это выражения, которые обрабатываются так же, как лямбда-выражения (. ), но вместо предоставления тела метода они ссылаются на существующий метод по имени.
Например, вместо написания лямбда-тела
Вы можете просто сделать
Во время выполнения эти два square метода ведут себя точно так же, как и другие. Байт-код может совпадать или не совпадать (хотя для вышеупомянутого случая генерируется один и тот же байт-код; скомпилируйте вышеприведенное и проверьте с помощью javap -c ).
Единственный основной критерий, который необходимо выполнить: метод, который вы предоставляете, должен иметь аналогичную сигнатуру с методом функционального интерфейса, который вы используете в качестве ссылки на объект .
Нижеследующее является незаконным:
square ожидает аргумент и возвращает double . get Метод Поставщиком возвращает значение , но не принимает аргумент. Таким образом, это приводит к ошибке.
Ссылка на метод относится к методу функционального интерфейса. (Как уже упоминалось, функциональные интерфейсы могут иметь только один метод каждый).
Еще несколько примеров: accept метод в Consumer принимает входные данные, но ничего не возвращает.
Выше, не getRandom принимает аргументов и возвращает double . Таким образом, можно использовать любой функциональный интерфейс, который удовлетворяет критериям: не принимать аргументов и возвращать double .
В случае параметризованных типов :
Ссылки на методы могут иметь разные стили, но по сути все они означают одно и то же и могут просто отображаться как лямбды:
- Статический метод ( ClassName::methName )
- Метод экземпляра определенного объекта ( instanceRef::methName )
- Супер метод конкретного объекта ( super::methName )
- Метод экземпляра произвольного объекта определенного типа ( ClassName::methName )
- Ссылка на конструктор класса ( ClassName::new )
- Ссылка на конструктор массива ( TypeName[]::new )
Источник