在Java8中创建方法引用数组的速记方法?

在Java8中创建方法引用数组的速记方法?,java,lambda,java-8,wicket-6,Java,Lambda,Java 8,Wicket 6,我正在使用Wicket 6/Java 8,并添加了一些简单的类,这些类利用Java 8中的lambda功能(我知道Wicket的更高版本支持lambda,但我们现在无法升级)。我正在创建一个LambdaModel,它有点像PropertyModel,我希望它可以消除对表示属性嵌套路径的字符串进行硬编码的需要 首先,我正在制作一个简单的只读版本。我制作了函数接口的可序列化版本,以创建以下内容: public class LambdaModelUtils { public static <

我正在使用Wicket 6/Java 8,并添加了一些简单的类,这些类利用Java 8中的lambda功能(我知道Wicket的更高版本支持lambda,但我们现在无法升级)。我正在创建一个LambdaModel,它有点像PropertyModel,我希望它可以消除对表示属性嵌套路径的字符串进行硬编码的需要

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

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
  }
}
SerializableFunction<Parent,Child> path0 = Parent::getChild;
SerializableFunction<Child,String> path1 = Child::getName;
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
                            path0, path1 );  // works
公共类lambdamodel{
声明的公共静态IModel(IModel目标,SerializableFunction…路径){
//创建依次通过路径中的每个函数工作的模型
}
}
我的实现运行良好,但唯一的问题是以“高效”方式调用此方法会导致编译错误:

IModel<Parent> parentModel = ...
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
                            Parent::getChild, Child::getName );  // Compile time error
IModel父模型=。。。
IModel模型=所列(父模型,
父::getChild,子::getName);//编译时错误
调用该方法的唯一方法是:

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
  }
}
SerializableFunction<Parent,Child> path0 = Parent::getChild;
SerializableFunction<Child,String> path1 = Child::getName;
IModel<String> model = LambdaModelUtils.ofNested( parentModel,
                            path0, path1 );  // works
SerializableFunction path0=Parent::getChild;
SerializableFunction path1=Child::getName;
IModel模型=所列(父模型,
路径0,路径1);//作品
这有点笨拙-有更好的方法吗

我看了,但这似乎也不起作用:

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

谢谢

我尝试了与您的代码类似的东西。将方法引用强制转换为函数接口类型可解决编译错误:

IModel<String> model =
    LambdaModelUtils.ofNested(parentModel,
                             (SerializableFunction<Parent,Child>) Parent::getChild, 
                             (SerializableFunction<Child,String>) Child::getName);
IModel模型=
列出的lambdamodels(父模型,
(SerializableFunction)父::getChild,
(SerializableFunction)子级::getName);

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

如果您使用这些函数来获取嵌套属性,但实际上不使用中间结果,我建议您只使用lambda表达式:

public static <X,R> IModel<R> ofNested(IModel<X> target, SerializableFunction<X, R> path)
嵌套的公共静态IModel(IModel目标,SerializableFunction路径)
IModel父模型=。。。
IModel model=lambdamodel.ofNested(parentModel,p->p.getChild().getName());

这是因为lambda的目标类型现在是已知的,而不是通用的
SerializedFunction
,您可以得到
SerialiedFunction
,其中
X=Parent
R=String

只是好奇而已。。。为什么不在使用方法引用的地方使用lambda表达式呢?因为
SerializableFunction
需要使用未经检查的强制转换,所以它并不比使用字符串来表示属性好,也就是说,根本没有编译时的安全性。您可以共享SerializableFunction接口签名吗