是否可以在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);
});
}
答案 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));
最后,如果要使用此模式,请不要忘记添加新方法ofAttribute1
和ofAttribute2
。 :)