gpt4 book ai didi

java - 在 Java 8 中创建方法引用数组的简写方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:01:38 25 4
gpt4 key购买 nike

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

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

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

这有点笨拙 - 有更好的方法吗?

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

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

谢谢

最佳答案

如果您使用这些函数来获取嵌套属性,但并不真正使用中间结果,我建议您只使用 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 .

关于java - 在 Java 8 中创建方法引用数组的简写方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50407462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com