传递函数作为参数来调用对象

时间:2016-04-14 08:34:30

标签: functional-programming java-8

是否可以在Java 8中实现它

而不是:

public void changeObject(int id) {    
        MyObject object= repository.findOne(id);
        if(object!= null) {
            object.setAttribute(true);
            repository.save(object);
        }            
    }

使用类似的东西:

doOperationOnItem(id,MyObject::setAttribute(true));

private void doOperationOnObject(int id, Function function) {
    resolve(()->repository.findOne(id)).ifPresent(item-> {
        function.callOn(item)
        repository.save(item);
    });
}

1 个答案:

答案 0 :(得分:1)

供您参考:

Optional.ofNullable(repository.findOne(id)).map(object -> object.ofAttribute(true))
                                           .ifPresent(object -> repository.save(object));

正如您所看到的,应该添加一个新方法来修改属性值并在类MyObject中返回此对象,如下所示:

public class MyObject{
    private Boolean attribute;

    // new method
    public MyObject ofAttribute(Boolean attribute){
         this.attribute = attribute;
         return this;
    }
}

如果有其他代码的模式就像你的例子,你可以用Java 8编写一个通用模式,就像这样:

public void changeObject(int id, Function<MyObject, MyObject> ... fun) {    
// the param fun is a array of Function, and use the method Stream.reduce and 
// Function::andThen to make these functions to a one function one by one
Optional.ofNullable(repository.findOne(id)).map(Stream.of(fun).reduce(Function::andThen).get())
                                                   .ifPresent(item -> repository.save(item));


}

所以使用这个模式,你的例子改变成这种方式:

xxx.changeObject(12, object -> object.ofAttribute(true))

现在您可以使用此模式更新多个属性:

xxx.changeObject(12, object -> object.ofAttribute(true), object -> object.ofAttribute1('Java'), Object -> object.ofAttribute2(1));

最后,如果要使用此模式,请不要忘记添加新方法ofAttribute1ofAttribute2。 :)