Что значит два двоеточия java

Содержание
  1. Русские Блоги
  2. [Java функциональное программирование 02] лямбда-выражение и двойное двоеточие
  3. Java лямбда-выражение
  4. 0 Подведём итог:
  5. 1 Что такое лямбда-выражение?
  6. 3 Синтаксис?
  7. 4 how?
  8. 5 Резюме
  9. 6 Двойная функция двоеточия:
  10. Интеллектуальная рекомендация
  11. Преобразования общих типов для передачи данных по протоколу iOS-TCP / IP (приветствуются дополнения
  12. Lotus версия 0.4.1 Данные цепочки блока Copy Block снижает синхронизацию
  13. Маленькая программа wx: ограничение количества списков цикла for
  14. Шантажировал биткойн впервые
  15. Оператор двойного двоеточия в Java 8
  16. 1. Обзор
  17. 2. От лямбд к оператору двойного двоеточия
  18. 3. Как это работает?
  19. 4. Ссылки на методы
  20. 4.1. Статический метод
  21. 4.2. Метод экземпляра существующего объекта
  22. 4.3. Метод экземпляра произвольного объекта определенного типа
  23. 4.4. Супер метод конкретного объекта
  24. 5. Ссылки на конструкторы
  25. 5.1. Создать новый экземпляр
  26. 5.2. Создать массив
  27. 6. Заключение
  28. Оператор двойного двоеточия в Java 8
  29. 1. Обзор
  30. Дальнейшее чтение:
  31. Вопросы для интервью Java 8(+ Ответы)
  32. Руководство По Java 8 Необязательно
  33. Новые функции в Java 8
  34. 2. От Лямбды к оператору двойного двоеточия
  35. 3. Как Это Работает?
  36. 4. Ссылки на методы
  37. 4.1. Статический метод
  38. 4.2. Метод экземпляра существующего объекта
  39. 4.3. Метод экземпляра Произвольного объекта Определенного типа
  40. 4.4. Супер-метод конкретного объекта
  41. 5. Ссылки на конструкторы
  42. 5.1. Создайте новый экземпляр
  43. 5.2. Создайте массив
  44. 6. Заключение
  45. :: (двойное двоеточие) оператор в Java 8

Русские Блоги

[Java функциональное программирование 02] лямбда-выражение и двойное двоеточие

Java лямбда-выражение

0 Подведём итог:

  1. Лямбда-выражения являются проявлением парадигмы функционального программирования на Java: реализация одного класса или интерфейса метода напрямую рассматривается как непосредственно определяемый функциональный метод, который улучшает читаемость и уменьшает объем кода в более компактной и лаконичной форме;
  2. Лямбда-выражения позволяют более компактно выражать экземпляры классов с одним методом. (Это описание перевода официального документа);
  3. Функция двойного двоеточия: если внутренняя реализация лямбда-выражения представляет собой один класс методов и имеет ту же форму входных параметров, что и интерфейс реализации, используйте двойное двоеточие: [имя класса (имя экземпляра класса) :: имя метода] для дальнейшего упрощения связанных выражений;

1 Что такое лямбда-выражение?

Лямбда-выражения, также известные как замыкания, являются наиболее важными новыми функциями, стимулирующими выпуск Java 8.

Читайте также:  Собака кряхтит что это значит

Лямбда допускает функции как параметры метода (функции передаются в методы как параметры).

Лямбда-выражения позволяют вам делать это, рассматривая функции как параметры метода или код как данные.

Лямбда-выражения позволяют более компактно выражать экземпляры классов с одним методом, а лямбда-выражения позволяют более компактно выражать экземпляры классов с одним методом.Класс одного методаПримеры.

  • Улучшить читаемость;
  • Уменьшить объем кода, сделать его более сжатым и компактным;

3 Синтаксис?

  • Разделенный запятыми список формальных параметров, заключенный в круглые скобки, Разделенный запятыми список параметров в круглых скобках;
  • The arrow token, -> Знак стрелки
  • Тело, состоящее из одного выражения или блока операторов. Тело, состоящее из одного выражения или блока операторов.
  • Если вы укажете одно выражение, среда выполнения Java оценит выражение и вернет его значение. Кроме того, вы можете использовать оператор возврата.
  • Если целевой тип лямбда-выражения и его захваченные параметры являются сериализуемыми, вы можете сериализовать его. Однако, как и для внутренних классов, настоятельно рекомендуется не сериализовать лямбда-выражения.

4 how?

5 Резюме

  1. В лямбда-интерфейсе callable и runnable есть только один метод, а именно run и call, которые не содержат входных параметров, и все лямбад-выражения не имеют входных параметров, если только вы сами не определите входные параметры, но call поддерживает return, что также является его характеристикой;
  2. лямбда-выражения подходят дляКласс с одним методом, то есть реализация интерфейса с одним методом

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 .

В случае параметризованных типов :

Ссылки на методы могут иметь разные стили, но по сути все они означают одно и то же и могут просто отображаться как лямбды:

  1. Статический метод ( ClassName::methName )
  2. Метод экземпляра определенного объекта ( instanceRef::methName )
  3. Супер метод конкретного объекта ( super::methName )
  4. Метод экземпляра произвольного объекта определенного типа ( ClassName::methName )
  5. Ссылка на конструктор класса ( ClassName::new )
  6. Ссылка на конструктор массива ( TypeName[]::new )

Источник

Оцените статью