我有以下代码,其中Binding.createStringBinding(...)
部分将重复多次,唯一的区别是使用的方法,即getA()
,getB()
,{{1} }
getC()
新 这是我想要重用的代码的一部分:
this.attributeA.bind(Bindings.createStringBinding(() -> {
if(webService.getLastValue() != null){
return webService.getLastValue().getA();
} else{
return "";
}
}, webService.lastValueProperty()));
this.attributeB.bind(Bindings.createStringBinding(() -> {
if(webService.getLastValue() != null){
return webService.getLastValue().getB();
} else{
return "";
}
}, webService.lastValueProperty()));
如何让这个可重复使用?也许这个功能呢?
答案 0 :(得分:4)
也许是这样的:
private Binding createBinder(final Supplier<String> lambda) {
return Bindings.createStringBinding(() -> {
if(webService.getLastValue() != null){
return lambda.get();
} else{
return "";
}
}
}
称为
this.attributeA.bind(createBinder(() -> webService.getLastValue().getA()), webService.lastValueProperty());
this.attributeB.bind(createBinder(() -> webService.getLastValue().getB()), webService.lastValueProperty());
答案 1 :(得分:1)
@ Joshua的回答略有不同。此处ObjectTest
是webService.getLastValue()
返回的类型。
private void makeBinding(StringProperty property, Function<ObjectTest, String> propertyAccessor) {
property.bind( Bindings.createStringBinding(() -> {
ObjectTest lastValue = webService.getLastValue();
if (lastValue == null) {
return "" ;
} else return propertyAccessor.apply(lastValue);
}, webService.lastValueProperty()) );
}
现在你做了
makeBinding(attributeA, ObjectTest::getA);
makeBinding(attributeB, ObjectTest::getB);
等
答案 2 :(得分:0)
我们假设attributeA
和attributeB
都实现了Property<String>
接口,方法getA
,getB
等都返回{{1} }。考虑到这一点,你可以这样做:
String
此代码创建一个BiConsumer<Property<String>, Function<ObjectTest, String>> binder =
(property, getter) ->
property.bind(Bindings.createStringBinding(() -> {
if (webService.getLastValue() != null) {
return getter.apply(webService.getLastValue());
} else {
return "";
}
}, webService.lastValueProperty()));
(使用2个参数的消费者)。
第一个参数是由BiConsumer
和Property<String>
实现的attributeA
实例(由@ James_D的评论建议)。
第二个参数是attributeB
,它是一个采用Function<ObjectTest, String>
实例并返回ObjectTest
的函数。在这里,我使用它来表示String
类(更具体地,ObjectTest
和ObjectTest::getA
)上的通用getter方法。
如果你愿意,你可以用java8友好的方式重写'BiConsumer':
ObjectTest::getB
使用它:
BiConsumer<Property<String>, Function<ObjectTest, String>> binder =
(property, getter) ->
property.bind(Bindings.createStringBinding(
() -> Optional.ofNullable(webService.getLastValue())
.map(getter).orElse(""),
webService.lastValueProperty()));
上面的代码假设方法binder.accept(this.attributeA, ObjectTest::getA);
binder.accept(this.attributeB, ObjectTest::getB);
,getA
等返回getB
。
您可能希望在javadoc中进一步了解Optional
和BiConsumer
。