【发布时间】:2015-06-26 21:26:06
【问题描述】:
假设我有这个课程:
public class FooToBarTransformer {
public Bar transform(Foo foo) {
// do some cool stuff
}
}
我想在其他课程中将其作为Function 使用:
public class Thing {
public Thing(Function<Foo, Bar> f) {
this.converter = f;
}
}
现在,如果我通过 Java 实例化 Thing,我会使用 Java8 Lambda 来实现,如下所示:
FooToBarTransformer transformer = new FooToBarTransformer();
new Thing((foo) -> transformer.transform(foo));
// or new Thing(transformer::transform);
我的问题是我需要创建一个 Thing 虽然是 spring。
<bean id="fooToBarTransformer" class="com.mypackage.FooToBarTransformer"/>
<bean id="theThing" class="com.mypackage.Thing">
<constructor-arg index="0" ????????? />
</bean>
现在,我考虑了一些可能的解决方法来简化此操作:
- 如果
FooToBarTransformer实现了Function,那么它只是一个简单的ref="fooToBarTransformer" - 我可以创建一个
FooToBarTransformer实现的不同接口并更改Thing以获取该接口的实例而不是Function。就本问题而言,这些都不是选项。
基于我在 spring xml 中执行的其他一些执行方式,我尝试了 value="#{(foo) -> fooToBarTransformer.transform(foo)}" 和 value="#{fooToBarTransformer::transform}",但 spring 对此感到窒息。
到目前为止,我想出的最佳选择是在代码中提供翻译功能:
public Function<Foo, Bar> toFunction() {
return transformer::transform;
}
并在春季使用value="#{fooToBarTransformer.toFunction()}" 引用它,但这似乎相当不成熟。
有更好的方法吗?
【问题讨论】:
-
旁注:
new Thing(transformer::transform); -
基本上,你不能。目前没有支持它的符号。
-
嘘。好吧,至少这是一个答案,而不是我永远想知道......
-
为什么你的
FooToBarTransformer不能实现Function<Foo,Bar>?您只需添加public Bar apply(Foo foo){return transform(foo);}即可。