Сокращенный метод для создания массива ссылок на методы в Java 8? - PullRequest
0 голосов
/ 18 мая 2018

Я использую Wicket 6 / Java 8 и добавляю несколько простых классов, которые используют функциональность лямбда из Java 8 (я знаю, что более поздние версии Wicket имеют поддержку лямбда, но мы не можем обновить сейчас).Я создаю LambdaModel, которая немного похожа на PropertyModel, которая, я надеюсь, избавит от необходимости жестко кодировать строки, представляющие вложенный путь к свойству.

Для начала я делаю простой readonlyверсия.Я сделал Serializable версии интерфейса Function для создания следующего:

public class LambdaModelUtils {
  public static <X,R> IModel<R> ofNested( IModel<X> target, SerializableFunction<?,?>... path ) {
     // creates a model that works through each function in the path in turn
  }
}

Моя реализация работает хорошо, но единственная проблема заключается в том, что вызов этого метода «эффективным» способом вызывает ошибки компиляции:

IModel<Parent> parentModel = ...
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
                            Parent::getChild, Child::getName );  // Compile time error

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

SerializableFunction<Parent,Child> path0 = Parent::getChild;
SerializableFunction<Child,String> path1 = Child::getName;
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
                            path0, path1 );  // works

Это немного неуклюже - есть ли лучший способ?

Я посмотрел здесь но, похоже, это тоже не работает:

List<SerializableFunction> path = Arrays.asList( Parent::getChild, Child::getName );

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

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

public static <X,R> IModel<R> ofNested(IModel<X> target, SerializableFunction<X, R> path)

IModel<Parent> parentModel = ...
IModel<String> model = LambdaModelUtils.ofNested(parentModel, p -> p.getChild().getName());

Это работает, поскольку теперь известен целевой тип лямбды, вместо универсального SerializedFunction<?, ?>, вы получите SerialiedFunction<X, R>, где X = Parent и R = String.

0 голосов
/ 18 мая 2018

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

IModel<String> model =
    LambdaModelUtils.ofNested(parentModel,
                             (SerializableFunction<Parent,Child>) Parent::getChild, 
                             (SerializableFunction<Child,String>) Child::getName);

Не самое симпатичное решение, но, по крайней мере, оно избавляет вас от необходимости объявлять переменные path0 и path1.

...