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

Что делает оператор двоеточия (:)?

Очевидно, двоеточие используется в Java по-разному. Не мог бы кто-нибудь объяснить, что он делает?

12 ответов

В Java-коде двоеточие используется в нескольких местах:

2) Тернарное условие (Учебник):

3) Для каждого цикла (Руководство):

5) Случай в операторе переключения (Учебник):

6) Ссылки на методы (Руководство)

Оператора «двоеточие» нет, но двоеточие встречается в двух местах:

1: В тернарном операторе, например:

В этом случае тернарный оператор действует как if для выражений. Если bigInt истинно, то x получит присвоенное ему значение 10000. Если нет, то 50. Двоеточие здесь означает «иначе».

2: В цикле для каждого:

Примечание: я говорю, что это не оператор, потому что это просто синтаксис. Само по себе оно не может появиться ни в одном выражении, и вполне вероятно, что и for-each, и тернарный оператор используют двоеточие.

Просто добавим, что при использовании в цикле for-each «:» можно в основном читать как «in».

Как бы вы написали этот для каждого цикла по-разному, чтобы не включать «:»?

Он используется в циклах for для перебора списка объектов.

В вашем конкретном случае,

Итак, если бы this.list был коллекцией <"2S", "3H", "4S">, то cardString в конце было бы такой строкой:

Обычно вы видите это в тернарном операторе присваивания;

Который по своей природе «эквивалентен» if else

Помимо примеров, приведенных на разных плакатах,

Он используется в новом сокращении for / loop

И тернарный оператор

Также в каждом цикле:

Он напечатает строку «что-то» три раза.

Поскольку большинство циклов for очень похожи, Java предоставляет ярлык для сокращения объема кода, необходимого для написания цикла, называемого для каждого цикла.

Вот пример краткого описания каждого цикла:

В приведенном выше примере двоеточие (:) можно читать как «in». Для каждого цикла в целом можно прочитать как «для каждого элемента Integer (называемого оценкой) в quizGrades распечатайте значение оценки».

Двоеточие используется в каждом цикле, попробуйте этот пример,

Источник

Оператор двойного двоеточия в Java 8

Краткое руководство по оператору двойного двоеточия в Java 8 и тому, как его следует использовать на практике.

1. Обзор

В этой краткой статье мы обсудим оператор с двойным двоеточием ( :: ) в Java 8 и рассмотрим сценарии, в которых может использоваться оператор.

Дальнейшее чтение:

Вопросы для интервью Java 8(+ Ответы)

Руководство По Java 8 Необязательно

Новые функции в Java 8

2. От Лямбды к оператору двойного двоеточия

С помощью лямбда-выражений мы видели, что код может стать очень кратким.

Например, для создания компаратора достаточно следующего синтаксиса:

Затем с выводом типа:

Но можем ли мы сделать приведенный выше код еще более выразительным и читабельным? Давайте посмотрим:

Мы использовали оператор :: в качестве сокращения для лямбд, вызывающих определенный метод – по имени. И конечным результатом, конечно, является еще более читаемый синтаксис.

3. Как Это Работает?

Затем мы можем работать с этой функцией:

Обратите внимание, что мы ссылаемся на функцию, а затем применяем ее к правильному аргументу.

4. Ссылки на методы

Мы можем хорошо использовать этот оператор в некоторых сценариях.

4.1. Статический метод

Во-первых, мы собираемся использовать статический метод утилиты :

4.2. Метод экземпляра существующего объекта

4.3. Метод экземпляра Произвольного объекта Определенного типа

Как вы можете видеть, мы ссылаемся на метод turn On Pc не на конкретный экземпляр, а на сам тип.

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 и нашел эту конкретную часть кода очень удивительной:

14 ответов

обычно, можно было бы назвать reduce способ использования Math.max(int, int) следующим образом:

обратите внимание, что это будет интерпретироваться компилятором, а не в JVM во время выполнения! Хотя он создает разные байт-коды для всех трех фрагментов кода, они семантически равны, поэтому последние две можно считать короткими (и, вероятно, более эффективными) версиями IntBinaryOperator над реализацией!

:: называется ссылкой на метод. Это в основном ссылка на один метод. Т. е. он ссылается на существующий метод по имени.

Краткое Описание:
Ниже приведен пример ссылки на статический метод:

square может передаваться так же, как ссылки на объекты и срабатывать при необходимости. Фактически, его можно так же легко использовать как ссылку на» нормальные » методы объектов, как static те. Для пример:

почему :: s являются удивительными это это:

ссылки на метод-это выражения, которые имеют ту же обработку, что и лямбда-выражения (. ), но вместо предоставления тела метода они ссылаются на существующий метод по имени.

Е. Г. вместо того, чтобы писать лямбда тела

вы можете просто сделать

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

ссылка на метод относится к методу функционального интерфейса. (как уже упоминалось, функциональные интерфейсы могут иметь только один способ каждый).

еще несколько примеров: accept метод потребитель принимает ввод, но ничего не возвращает.

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

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

для получения дополнительной информации см. http://cr.openjdk.java.net /

Да, это правда. The :: оператор используется для ссылки на метод. Итак, можно извлечь static методы из классов, используя его или методы из объектов. Один и тот же оператор может использоваться даже для конструкторов. Все случаи, упомянутые здесь, приведены в примере кода ниже.

официальная документация от Oracle может быть найдена здесь.

вы можете иметь лучший обзор изменений JDK 8 в этой статьи. В метод/конструктор ссылок раздел пример кода также предоставляется:

для ссылки на статические методы синтаксис:

для ссылки на нестатические методы синтаксис

единственным предварительным условием для ссылки на метод является то, что метод существует в функциональном интерфейсе, который должен быть совместим с ссылка на метод.

ссылки на метод при оценке создают экземпляр функционального интерфейса.

это ссылка на метод в Java 8. Документация oracle является здесь.

Как указано в документации.

метод reference Person:: compareByAge является ссылкой на статический метод.

ниже приведен пример ссылки на метод экземпляра конкретный объект:

ссылка на метод myComparisonProvider:: compareByName вызывает метод compareByName это часть объекта myComparisonProvider. Среда JRE выводит аргументы типа метода, которые в данном случае являются (Person, Person).

рассмотрим следующий простой класс, где каждый сотрудник имеет имя и класс.

Предположим, у нас есть список сотрудники возвращаются каким-то методом, и мы хотим отсортировать сотрудников по их классу. Мы знаем, что можем использовать анонимный класс as:

где getDummyEmployee() метод так:

вроде все хорошо, но что если класс Employee также предоставляет аналогичный метод:

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

по состоянию на docs существует четыре вида ссылок на метод:

:: оператор был введен в java 8 для ссылок на методы. Ссылка на метод-это сокращенный синтаксис для лямбда-выражения, которое выполняет только один метод. Вот общий синтаксис ссылки на метод:

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

сделать код более ясным, вы можете превратить это лямбда-выражение в ссылку на метод:

the :: известен как ссылки на метод. Допустим, мы хотим вызвать метод calculatePrice покупки класса. Тогда мы можем написать так:

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

во время выполнения они ведут себя точно так же.Байт-код может / не быть одинаковым (для вышеуказанного Incase он генерирует тот же байт-код(complie выше и проверяет javaap-c;))

во время выполнения они ведут себя точно так же.метод (math:: max);, он генерирует ту же математику (компли выше и проверяет javap-c;))

return reduce(Math::max); и НЕ РАВНО to return reduce(max());

но это значит, что-то вроде этого:

можно просто сохранить 47 клавиш если вы пишете так

в java-8 Streams Reducer в simple works-это функция, которая принимает два значения в качестве входных и возвращает результат после некоторого вычисления. этот результат подается на следующей итерации.

в случае функции Math: max метод продолжает возвращать максимум двух переданных значений, и в конце концов у вас есть наибольшее число в руке.

так как многие ответы здесь объясняются хорошо :: поведение, кроме того, я хотел бы пояснить, что :: оператор не должен иметь точно такую же сигнатуру, как ссылающийся функциональный интерфейс, если он используется, например, переменные. Предположим, нам нужно BinaryOperator, который имеет вид TestObject. Традиционным способом его реализовали следующим образом:

как вы видите в анонимной реализации требует два аргумента TestObject и возвращает объект TestObject. Чтобы выполнить это условие, используйте :: оператор мы можем начать со статическим методом:

Ok он скомпилирован нормально. Что, если нам нужен метод экземпляра? Позволяет обновить TestObject с помощью метода экземпляра:

теперь мы можем получить доступ к экземпляру, как показано ниже:

этот код компилируется нормально, но ниже одного не:

справедливо его метод экземпляра, но если мы перегрузим testInstance как показано ниже:

код будет компилировать просто отлично. Потому что это вызовет testInstance С одним параметром вместо двойной. Хорошо, так что случилось, наши двое? параметр? Давайте распечатаем и посмотрим:

что будет на выходе:

ОК, поэтому JVM достаточно умен, чтобы вызвать param1.testInstance (param2). Можем ли мы использовать testInstance из другого ресурса, но не TestObject, т. е.:

он просто не будет компилироваться, и компилятор скажет: » тип TestUtil не определяет testInstance (TestObject, TestObject)». Поэтому компилятор будет искать статическую ссылку если это не один и тот же тип. Хорошо, а как насчет полиморфизма? Если мы удалим окончательные модификаторы и добавим наши SubTestObject класс:

он также не будет компилироваться, компилятор все равно будет искать статическую ссылку. Но ниже код будет компилироваться отлично, так как он проходит is-a test:

*я просто учусь, поэтому я понял, попробуйте и посмотрите, не стесняйтесь поправлять меня, если я неправильно!—28—>

нашел этот источник очень интересно.

Шаг 1:

Шаг 2:

Шаг 3:

в старых версиях Java вместо»:: «или lambd вы можете использовать:

Источник

:: (двойное двоеточие) оператор в Java 8

Я изучал исходный код Java 8 и обнаружил, что эта конкретная часть кода очень удивительна:

18 ответов

Обычно метод reduce вызывается с помощью Math.max(int, int) следующим образом:

classname :: methodName

Используя двойное двоеточие ::

Оператор с двойным двоеточием (: :), также известный как оператор ссылки на метод в Java, используется для вызова метода путем прямого обращения к нему с помощью его класса. Они ведут себя точно так же, как лямбда-выражения. Единственное отличие, которое он имеет от лямбда-выражений, состоит в том, что здесь используется прямая ссылка на метод по имени вместо предоставления делегата методу.

Этот символ можно использовать вместо ламда-выражений

Также при программировании чаще всего используется первый метод.

Итак, я вижу здесь массу откровенно запутанных ответов, и это еще не все.

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

Теперь давайте кратко рассмотрим, что такое ссылки на методы:

Чтобы соотнести это с вашими вопросами, необходимо понимать лямбда-выражение Java. Что несложно.

InterfaceX может быть любым из этого:

Давайте возьмем первый представленный случай и встроенное лямбда-выражение, которое мы определили ранее.

До Java 8 вы могли определить это аналогичным образом:

Функционально это то же самое. Разница больше в том, как компилятор это воспринимает.

Теперь, когда мы рассмотрели встроенное лямбда-выражение, давайте вернемся к «Ссылки на методы» (: :). Допустим, у вас есть такой класс:

Мы можем написать это так:

И это эквивалентно этому:

Крутая вещь и преимущество ссылок на методы в том, что сначала, пока вы не назначите их переменным, они не имеют типа. Таким образом, вы можете передавать их в качестве параметров в любой эквивалентный функциональный интерфейс (имеющий те же определенные типы). Что и происходит в вашем случае

В более старых версиях Java вместо «::» или lambd вы можете использовать:

Или переходя к методу:

В java-8 Streams Reducer в простых случаях представляет собой функцию, которая принимает на вход два значения и возвращает результат после некоторого расчета. этот результат передается на следующей итерации.

В случае функции Math: max метод продолжает возвращать максимум из двух переданных значений, и в конце у вас есть наибольшее число в руке.

Хорошо, он скомпилирован нормально. А что насчет того, нужен ли нам метод экземпляра? Давайте обновим TestObject методом экземпляра:

Теперь мы можем получить доступ к экземпляру, как показано ниже:

Этот код компилируется нормально, но не ниже:

Код просто компилируется нормально. Потому что он вызовет testInstance с одним параметром вместо двойного. Итак, что случилось с нашими двумя параметрами? Распечатываем и посмотрим:

Итак, JVM достаточно умен, чтобы вызвать param1.testInstance (param2). Можем ли мы использовать testInstance из другого ресурса, но не из TestObject, то есть:

Он также не будет компилироваться, компилятор все равно будет искать статическую ссылку. Но приведенный ниже код будет компилироваться нормально, поскольку он проходит тест is-a:

* Я только учусь, поэтому я понял, попробовав, не стесняйтесь поправлять меня, если я ошибаюсь

return reduce(Math::max); НЕ РАВНО return reduce(max());

Но это значит, что-то вроде этого:

Мне очень интересен этот источник.

ШАГ1:

:: известен как ссылки на методы. Допустим, мы хотим вызвать метод calculatePrice класса Purchase. Тогда мы можем записать это как:

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

Чтобы сделать код более понятным, вы можете превратить это лямбда-выражение в ссылку на метод:

Ссылка на метод Person :: compareByAge является ссылкой на статический метод.

Ниже приводится пример ссылки на метод экземпляра конкретного объекта:

Ссылка на метод myComparisonProvider :: compareByName вызывает метод compareByName, который является частью объекта myComparisonProvider. JRE определяет аргументы типа метода, которыми в данном случае являются (Person, Person).

Для ссылки на статические методы используется следующий синтаксис:

Для ссылки на нестатические методы синтаксис:

Единственным предварительным условием для ссылки на метод является то, что метод существует в функциональном интерфейсе, который должен быть совместим со ссылкой на метод.

Ссылки на методы при оценке создают экземпляр функционального интерфейса.

Рассмотрим следующий простой класс, в котором у каждого сотрудника есть имя и оценка.

Предположим, у нас есть список сотрудников, возвращенный каким-то методом, и мы хотим отсортировать сотрудников по их оценкам. Мы знаем, что можем использовать анонимный класс как:

Вроде все хорошо, но что, если класс Employee также предоставляет аналогичный метод:

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

Согласно docs, существует четыре вида ссылок на методы:

Да это правда. Оператор :: используется для ссылки на метод. Таким образом, можно извлечь статические методы из классов, используя его, или методы из объектов. Тот же оператор можно использовать даже для конструкторов. Все упомянутые здесь случаи проиллюстрированы в примере кода ниже.

Официальную документацию Oracle можно найти здесь.

Вы можете лучше ознакомиться с изменениями JDK 8 в эту статью. В разделе Ссылки на метод / конструктор также приведен пример кода:

:: называется «Справочник по методам». По сути, это ссылка на один метод. т.е. он ссылается на существующий метод по имени.

Краткое объяснение :
Ниже приведен пример ссылки на статический метод:

Причина, по которой :: такие классные, заключается в том, что :

Например. вместо написания тела лямбда

Вы можете просто сделать

Единственный важный критерий, которому необходимо соответствовать: предоставляемый вами метод должен иметь сигнатуру, аналогичную методу функционального интерфейса, который вы используете в качестве ссылки на объект .

Нижеследующее является незаконным:

Ссылка на метод относится к методу функционального интерфейса. (Как уже упоминалось, каждый функциональный интерфейс может иметь только один метод).

Еще несколько примеров: метод accept в Потребитель принимает данные, но ничего не возвращает.

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

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

Источник

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

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

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

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

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

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

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

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

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

3 Синтаксис?

4 how?

5 Резюме

6 Двойная функция двоеточия:

Имя класса (имя экземпляра класса) :: имя метода

Выражение можно упростить, оно эквивалентно ссылке на закрытие метода;

Интеллектуальная рекомендация

Запись шага операции Git

Возьмите любое число из массива и суммируйте до решения указанного значения (JavaScript)

По заданному массиву [1,2,3,4,5,6,7,8,9,10] найдите любую комбинацию массивов, сумма которых равна 10. Обратите внимание, что одно число в каждой комбинации может появляться только один раз. Массив им.

что значит двоеточие в java. Смотреть фото что значит двоеточие в java. Смотреть картинку что значит двоеточие в java. Картинка про что значит двоеточие в java. Фото что значит двоеточие в java

Реализация основного боевого проекта Vue-cli 8 main layout

Каталог статей Предыдущая глава Реализация основного макета Базовая реализация Слева прокрутите Украсьте полосу прокрутки Полный код Следующая глава Предыдущая глава Vue-cli Actual Combat Project 7 от.

что значит двоеточие в java. Смотреть фото что значит двоеточие в java. Смотреть картинку что значит двоеточие в java. Картинка про что значит двоеточие в java. Фото что значит двоеточие в java

Предварительная обработка данных: переменная проверка и преобразование

Переменная проверка и преобразование Мы столкнемся с проблемой фильтрации переменных при обработке данных. Здесь мы либо PCA (анализ основных компонентов), либо простая фильтрация искусственных переме.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *