如何编写方法使此代码可重用?

时间:2015-10-13 13:35:05

标签: java javafx

我有以下代码,其中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()));

如何让这个可重复使用?也许这个功能呢?

3 个答案:

答案 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的回答略有不同。此处ObjectTestwebService.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)

我们假设attributeAattributeB都实现了Property<String>接口,方法getAgetB等都返回{{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个参数的消费者)。

第一个参数是由BiConsumerProperty<String>实现的attributeA实例(由@ James_D的评论建议)。

第二个参数是attributeB,它是一个采用Function<ObjectTest, String>实例并返回ObjectTest的函数。在这里,我使用它来表示String类(更具体地,ObjectTestObjectTest::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中进一步了解OptionalBiConsumer

相关问题