Каково использование ссылки на конструктор в Java 8

Я читал о функциях Java 8, которые привели меня к этому article, и мне было интересно узнать о фактическом использовании ссылки на конструктор, я имею в виду, почему бы просто не использовать new Obj ?

P.S. пробовал гуглить, но ничего толкового не нашел, если у кого-то есть пример кода, ссылка или тут будет здорово


person Ismail Marmoush    schedule 01.04.2015    source источник


Ответы (2)


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

Примеры в связанной статье могут показаться не такими уж полезными, но это общая проблема коротких автономных примеров кода. Точно так же, как и с программой «hello world». Это не более полезно, чем набирать текст «hello world» прямо в консоли, но в любом случае это не так. Его цель — продемонстрировать язык программирования.

Как показал assylias, существуют варианты использования уже существующих функциональных interface с использованием JFC API.


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

Поскольку целью interface является абстрагирование базовой операции, варианты использования — это места, где вы не хотите выполнять безусловную операцию new SomeType(…).

Одним из примеров является общеизвестный шаблон Factory, в котором вы определяете interface для создания объекта, а реализация factory через ссылку на конструктор — это только один вариант из бесконечных возможностей.

Еще одним важным моментом являются всевозможные Generic-методы, где нужна возможность конструировать экземпляры неизвестного из-за стирания типа экземпляра. Они могут быть реализованы через функцию, которая передается в качестве параметра, и подходит ли один из существующих функциональных interfaces или требуется пользовательский, просто зависит от требуемого количества и типов параметров.

person Holger    schedule 01.04.2015
comment
Большое спасибо, Хольгер, я обязательно вернусь еще несколько раз, чтобы прочитать его снова, я думаю, что точки в моей голове проясняются, но еще не связаны :) ура! - person Ismail Marmoush; 01.04.2015

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

List<String> filtered = stringList.stream()
        .filter(s -> !s.isEmpty())
        .collect(Collectors.toCollection(ArrayList::new)); //() -> new ArrayList<> ()

Map<String, BigDecimal> numbersMap = new HashMap<>();
numbersMap.computeIfAbsent("2", BigDecimal::new); // s -> new BigDecimal(s)

someStream.toArray(Object[]::new); // i -> new Object[i]

и т.п.

person assylias    schedule 01.04.2015
comment
большое спасибо, но как насчет функционального интерфейса, подобного упомянутому в статье, добавляют ли они какие-либо ярлыки или функции, кроме Obj::new - person Ismail Marmoush; 01.04.2015