我正在尝试将数据集(我们称之为Set1)映射到另一个(Set2)。通过将操作应用于Set1的子集并将结果放置到Set2的对象来完成映射。我想知道如何以高效和优雅的方式构建类(尝试学习OOP)。下面的代码正在运行,但类的初始化顺序和内容有点尴尬。
interface Operator{
public void transform(List<String> from, Element to);
}
class Transform{
public List<String> fromIndex;
public Integer toIndex;
Operator op;
Mapper m;//NICE TO NOT HAVE ref to Mapper
Transform(List<String> fromIndex, Integer toIndex, Operator op, Mapper m){
this.fromIndex = fromIndex;
this.toIndex = toIndex;
this.op = op;
this.m = m;
}
public void execute(){
List<String> from = new ArrayList<String>();
Element to = m.Set2.get(toIndex);
for(String s : fromIndex){
from.add(m.Set1.get(s));
}
op.transform(from,to);
}
}
class Mapper{
Map<String,String> Set1;
Map<Integer,Element> Set2;
List<Transform> transforms;
Mapper(Map<String,String> Set1, Map<Integer,Element> Set2){
this.Set1= Set1;
this.Set2= Set2;
}
public void setTransforms(List<Transform> transforms){
this.transforms = transforms;
}
public void doMapping(){
for(Transform t: transforms){
t.execute();
}
}
}
典型的使用场景,假设已经填充了Set1和Set2(Set2填充了其值将被更新的元素):
List<Transform> tList = new ArrayList<Transform>();
Mapper m = new Mapper(Set1,Set2);
tList.add(new Transform(new ArrayList<String>(Arrays.asList("3", "3_")),3,concatStringToInteger,m));
tList.add(new Transform(new ArrayList<String>(Arrays.asList("4", "4_")),4,concatStringToInteger,m));
tList.add(new Transform(new ArrayList<String>(Arrays.asList("22")),22,concatStringToInteger,m));
tList.add(new Transform(new ArrayList<String>(Arrays.asList("24")),24,concatStringToInteger,m));
m.setTransforms(tList);
m.doMapping();
运营商只是一些可重复使用的lamba exp。正如您所看到的,Transform需要保持ref to mapper,整个初始化很尴尬。这不是关于功能的问题(所以请忽略任何代码错误,代码可以工作),而是关于在OOP(并保持一定程度的通用性)方式中构造它。 感谢
答案 0 :(得分:0)
您有一个操作,它接受字符串列表并将其映射到Element类型的对象。以编程方式,这意味着可以从字符串列表构建Element类型的对象。
现在,从类型元素开始:
class Element {
some attributes
// some default constructor
// constructor needed for this case,
Element(List<String> from);
}
程序的其余部分
class Mapper{
Some Collection of input I
Element e;
Some Collection of ouput O
...
within a loop
// construct a single element
e = Element(get input from I)
// add new element to output collection
O.add(e)
}