Hãy nói rằng tôi có lớp học này:Sử dụng một hàm Java8 Lambda bên trong XML mùa xuân
public class FooToBarTransformer {
public Bar transform(Foo foo) {
// do some cool stuff
}
}
Và tôi muốn tiêu thụ nó như một Function
trong một số lớp khác:
public class Thing {
public Thing(Function<Foo, Bar> f) {
this.converter = f;
}
}
Bây giờ, nếu tôi 'm instantiating một Thing
qua Java, tôi muốn làm điều đó với Java8 Lambdas như thế này:
FooToBarTransformer transformer = new FooToBarTransformer();
new Thing((foo) -> transformer.transform(foo));
// or new Thing(transformer::transform);
Vấn đề của tôi là tôi cần tạo Thing
mặc dù mùa xuân.
<bean id="fooToBarTransformer" class="com.mypackage.FooToBarTransformer"/>
<bean id="theThing" class="com.mypackage.Thing">
<constructor-arg index="0" ????????? />
</bean>
Giờ đây, có một vài cách giải quyết có thể, tôi đã xem xét để làm điều này dễ dàng hơn:
- nếu
FooToBarTransformer
thực hiệnFunction
, sau đó nó sẽ chỉ là một đơn giảnref="fooToBarTransformer"
- tôi có thể tạo ra một giao diện khác nhau mà
FooToBarTransformer
thực hiện và thay đổiThing
để xem phiên bản giao diện đó thay vìFunction
. Đối với mục đích của câu hỏi này, không phải trong số đó là những lựa chọn.
Dựa trên một số cách khác tôi đã nhìn thấy làm hành quyết trong xml mùa xuân, tôi đã cố gắng value="#{(foo) -> fooToBarTransformer.transform(foo)}"
và value="#{fooToBarTransformer::transform}"
nhưng mùa xuân nghẹn ngào về vấn đề này.
Lựa chọn tốt nhất mà tôi đã đưa ra cho đến nay là để cung cấp một chức năng dịch trong mã:
public Function<Foo, Bar> toFunction() {
return transformer::transform;
}
và tham khảo nó trong mùa xuân với value="#{fooToBarTransformer.toFunction()}"
, nhưng điều này có vẻ khá hokey.
Có cách nào tốt hơn để thực hiện việc này không?
Lưu ý phụ: 'Điều mới (biến áp :: biến đổi);' – assylias
http://stackoverflow.com/questions/30651157/how-to-declare-a-java-8-method-reference-in-a- spring-xml-file –
Về cơ bản, bạn không thể. Không có ký hiệu để hỗ trợ nó vào lúc này. –