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);
不是最漂亮的解决方案,但至少它使您无需声明 path0
和 path1
变量。
如果您使用这些函数来获得嵌套的 属性,但并不真正使用中间结果,我建议您只使用 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 = Parent
和 R = String
。
我正在使用 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);
不是最漂亮的解决方案,但至少它使您无需声明 path0
和 path1
变量。
如果您使用这些函数来获得嵌套的 属性,但并不真正使用中间结果,我建议您只使用 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 = Parent
和 R = String
。