我试图使用java消费者接口来摆脱冗余代码。我有这样一个物体:
public class Data {
private int id;
private String d1;
private String d2;
private String d3;
private String d4;
}
@Getter
public class Container {
private List<Data> data;
}
有几个函数可以这样更改数据对象的值:
public static void actionForD1(Container container) {
container.getData().forEach(data -> {
Source s = getSource(data.getId());
String value = s.getValueForD1();
//do maybe some more transformation with the value
data.setD1(value);
});
}
public static void actionForD2(Container container) {
container.getData().forEach(data -> {
Source s = getSource(data.getId());
String value = s.getValueForD2();
//do maybe some more transformation with the value
data.setD2(value);
});
}
...
他们都有相同的习惯。迭代数据对象,获取源对象并基于id进行一些计算。
现在是否可以使用java消费者接口来做这样的事情
process(container, data -> {
String value = s.getSomething();
//do maybe some more stuff with value
data.setD2(value);
});
public static void process(Container container, Consumer<Data> c) {
container.getData().forEach(data -> {
Source s = getSource(data.getId());
c(s);
});
}
我的方法的问题是,源对象在使用者内部是不可访问的。有可能这样做吗?或者这是一个糟糕的方法?
2条答案
按热度按时间pxiryf3j1#
我想你是在要求这样的东西:
scyqe7ek2#
您可以使用两个功能接口来提供
id
它是Source
查找和实际设置Data
待执行。使用相当灵活:
还要注意的是,在您的
actionForD2
方法,参数data
不能在lambda表达式中使用,只要它已在方法参数级别定义。