Java два двоеточия подряд

Содержание
  1. Оператор с двоеточием в Java 8
  2. Дальнейшее чтение:
  3. Java 8 Интервью Вопросы (+ ответы)
  4. Руководство по Java 8 Необязательно
  5. Новые функции в Java 8
  6. 2. От лямбд к оператору двойного двоеточия
  7. 3. Как это работает?
  8. 4. Ссылки на метод
  9. 4.1. Статический метод
  10. 4.2. Метод экземпляра существующего объекта
  11. 4.3. Метод экземпляра произвольного объекта определенного типа
  12. 4.4. Супер метод конкретного объекта
  13. 5. Ссылки на конструктор
  14. 5.1. Создать новый экземпляр
  15. 5.2. Создать массив
  16. 6. Заключение
  17. Оператор двойного двоеточия в Java 8
  18. 1. Обзор
  19. Дальнейшее чтение:
  20. Вопросы для интервью Java 8(+ Ответы)
  21. Руководство По Java 8 Необязательно
  22. Новые функции в Java 8
  23. 2. От Лямбды к оператору двойного двоеточия
  24. 3. Как Это Работает?
  25. 4. Ссылки на методы
  26. 4.1. Статический метод
  27. 4.2. Метод экземпляра существующего объекта
  28. 4.3. Метод экземпляра Произвольного объекта Определенного типа
  29. 4.4. Супер-метод конкретного объекта
  30. 5. Ссылки на конструкторы
  31. 5.1. Создайте новый экземпляр
  32. 5.2. Создайте массив
  33. 6. Заключение
  34. Читайте ещё по теме:
  35. Оператор двойного двоеточия в Java 8
  36. Пример использования оператора двойного двоеточия
  37. Понимание оператора ::
  38. Вывод

Оператор с двоеточием в Java 8

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

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

Java 8 Интервью Вопросы (+ ответы)

Набор популярных вопросов об интервью, связанных с Java8, и, конечно, ответов.

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

Краткое и практическое руководство по дополнительному в Java 8

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

Краткое введение в новые функции Java 8; основное внимание уделяется стандартным и статическим интерфейсным методам, статическим ссылкам на методы и необязательным.

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

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

Читайте также:  Какие настройки в java

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

Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());
Comparator c = (c1, c2) -> c1.getAge().compareTo(c2.getAge());

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

Comparator c = Comparator.comparing(Computer::getAge);

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

3. Как это работает?

Проще говоря, когда мы используем ссылку на метод — целевая ссылка помещается перед разделителем::, а имя метода указывается после него.

Мы рассматриваем ссылку на методgetAge, определенный в классеComputer.

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

Function getAge = Computer::getAge; Integer computerAge = getAge.apply(c1);

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

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

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

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

Во-первых, мы собираемся использоватьa static utility method:

List inventory = Arrays.asList( new Computer( 2015, "white", 35), new Computer(2009, "black", 65)); inventory.forEach(ComputerUtils::repair);

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

Затем давайте посмотрим на интересный сценарий —referencing a method of an existing object instance.

Мы собираемся использовать переменнуюSystem.out — объект типаPrintStream, который поддерживает методprint:

Computer c1 = new Computer(2015, "white"); Computer c2 = new Computer(2009, "black"); Computer c3 = new Computer(2014, "black"); Arrays.asList(c1, c2, c3).forEach(System.out::print);

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

Computer c1 = new Computer(2015, "white", 100); Computer c2 = new MacbookPro(2009, "black", 100); List inventory = Arrays.asList(c1, c2); inventory.forEach(Computer::turnOnPc);

Как видите, мы ссылаемся на методturnOnPc не на конкретный экземпляр, а на сам тип.

В строке 4 метод экземпляраturnOnPc будет вызываться для каждого объектаinventory.

И это, естественно, означает, что — дляc1 методturnOnPc будет вызываться в экземпляреComputer, а дляc2 — в экземпляреMacbookPro.

4.4. Супер метод конкретного объекта

Предположим, у вас есть следующий метод в суперклассеComputer:

public Double calculateValue(Double initialValue) < return initialValue/1.50; >

и этот в подклассеMacbookPro:

@Override public Double calculateValue(Double initialValue) < Functionfunction = super::calculateValue; Double pcValue = function.apply(initialValue); return pcValue + (initialValue/10) ; >

Вызов методаcalculateValue в экземпляреMacbookPro:

macbookPro.calculateValue(999.99);

также вызоветcalculateValue суперклассаComputer.

5. Ссылки на конструктор

5.1. Создать новый экземпляр

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

@FunctionalInterface public interface InterfaceComputer < Computer create(); >InterfaceComputer c = Computer::new; Computer computer = c.create();

Что если у вас есть два параметра в конструкторе?

BiFunction c4Function = Computer::new; Computer c4 = c4Function.apply(2013, "white");

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

@FunctionalInterface interface TriFunction  < R apply(A a, B b, C c); default TriFunction andThen( Function after) < Objects.requireNonNull(after); return (A a, B b, C c) ->after.apply(apply(a, b, c)); > >

Затем инициализируйте ваш объект:

TriFunction c6Function = Computer::new; Computer c3 = c6Function.apply(2008, "black", 90);

5.2. Создать массив

Наконец, давайте посмотрим, как создать массив объектовComputer с пятью элементами:

Function computerCreator = Computer[]::new; Computer[] computerArray = computerCreator.apply(5);

6. Заключение

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

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

Полныйsource code для примера доступен вthis GitHub project — это проект Maven и Eclipse, поэтому его можно импортировать и использовать как есть.

Источник

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

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

1. Обзор

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

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

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

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

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

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

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

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

Comparator c = (Computer c1, Computer c2) -> c1.getAge().compareTo(c2.getAge());
Comparator c = (c1, c2) -> c1.getAge().compareTo(c2.getAge());

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

Comparator c = Comparator.comparing(Computer::getAge);

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

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

Очень просто, когда мы используем ссылку на метод – целевая ссылка помещается перед разделителем :: , а имя метода указывается после него.

Мы смотрим на ссылку метода на метод getAge , определенный в классе Computer .

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

Function getAge = Computer::getAge; Integer computerAge = getAge.apply(c1); 

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

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

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

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

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

List inventory = Arrays.asList( new Computer( 2015, "white", 35), new Computer(2009, "black", 65)); inventory.forEach(ComputerUtils::repair);

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

Далее давайте рассмотрим интересный сценарий – ссылка на метод существующего экземпляра объекта .

Мы будем использовать переменную System . out – объект типа PrintStream , который поддерживает метод print :

Computer c1 = new Computer(2015, "white"); Computer c2 = new Computer(2009, "black"); Computer c3 = new Computer(2014, "black"); Arrays.asList(c1, c2, c3).forEach(System.out::print);

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

Computer c1 = new Computer(2015, "white", 100); Computer c2 = new MacbookPro(2009, "black", 100); List inventory = Arrays.asList(c1, c2); inventory.forEach(Computer::turnOnPc);

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

В строке 4 метод экземпляра turn On Pc будет вызываться для каждого объекта inventory .

И это, естественно, означает, что – для c1 метод turnOnPc будет вызван на экземпляре Computer , а для c2 на экземпляре MacBookPro .

4.4. Супер-метод конкретного объекта

Предположим, у вас есть следующий метод в суперклассе Computer :

public Double calculateValue(Double initialValue) < return initialValue/1.50; >

и этот в Macbook Pro подклассе:

@Override public Double calculateValue(Double initialValue) < Functionfunction = super::calculateValue; Double pcValue = function.apply(initialValue); return pcValue + (initialValue/10) ; > 

Вызов метода calculate Value на экземпляре Macbook Pro :

macbookPro.calculateValue(999.99);

также вызовет также вызов calculate Value на компьютере суперклассе.

5. Ссылки на конструкторы

5.1. Создайте новый экземпляр

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

@FunctionalInterface public interface InterfaceComputer < Computer create(); >InterfaceComputer c = Computer::new; Computer computer = c.create();

Что делать, если у вас есть два параметра в конструкторе?

BiFunction c4Function = Computer::new; Computer c4 = c4Function.apply(2013, "white"); 

Если параметров три или более, необходимо определить новый функциональный интерфейс:

@FunctionalInterface interface TriFunction  < R apply(A a, B b, C c); default TriFunction andThen( Function after) < Objects.requireNonNull(after); return (A a, B b, C c) ->after.apply(apply(a, b, c)); > > 

Затем инициализируйте свой объект:

TriFunction c6Function = Computer::new; Computer c3 = c6Function.apply(2008, "black", 90); 

5.2. Создайте массив

Наконец, давайте посмотрим, как создать массив Computer объектов с пятью элементами:

Function computerCreator = Computer[]::new; Computer[] computerArray = computerCreator.apply(5); 

6. Заключение

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

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

Полный исходный код для примера доступен в этом проекте GitHub – это проект Maven и Eclipse, поэтому его можно импортировать и использовать как есть.

Читайте ещё по теме:

Источник

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

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

Пример использования оператора двойного двоеточия

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

new Thread(new Runnable() < @Override public void run() < System.out.println("Hello from new thread"); >>).start();

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

new Thread(System.out::println).start();

Это значительно упрощает код и делает его более читаемым.

Понимание оператора ::

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

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

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

Вывод

Оператор двойного двоеточия (::) — это мощное нововведение в Java 8, которое облегчает работу с методами и конструкторами. Он делает код более чистым и упрощает его чтение и понимание.

Источник

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