Shorthand 在 Java 8 中创建方法引用数组的方法?

Shorthand method for creating array of method references in Java 8?

我正在使用 Wicket 6/Java 8 并正在添加一些简单的 类 来利用 Java 8 中的 lambda 功能(我知道 Wicket 的更高版本有 lambda 支持,但我们现在无法升级)。我正在创建一个有点像 PropertyModel 的 LambdaModel,我希望它可以消除对表示 属性.

的嵌套路径的字符串进行硬编码的需要

首先,我正在制作一个简单的只读版本。我制作了函数接口的可序列化版本以创建以下内容:

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
  }
}

我的实现运行良好,但唯一的问题是以 'efficient' 方式调用此方法会导致编译错误:

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 );

谢谢

我尝试了与您的代码类似的方法。将方法引用转换为功能接口类型解决了编译错误:

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

不是最漂亮的解决方案,但至少它使您无需声明 path0path1 变量。

如果您使用这些函数来获得嵌套的 属性,但并不真正使用中间结果,我建议您只使用 lambda 表达式:

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());

这是可行的,因为现在已知 lambda 的目标类型,而不是泛型 SerializedFunction<?, ?>,您得到 SerialiedFunction<X, R>,其中 X = ParentR = String