Java 中也有一些自动映射的插件,比如modelmapper 和 mapperstruct,但是一般只能针对简单的映射,复杂的对象映射只能通过手动映射,手动映射也不需要我们一个一个的写get,set。可以通过自动生成映射的工具,generateO2O,可以在setting中的plugins中查找该插件,并安装,重启IDEA,使用快捷键alt+insert 就可以在下拉列表中看到了。
安装:
然后可以在下拉列表中看到改插件:
使用方式:
写一个对象转化的方法,参数是需要转化的,返回值是目标类型,
然后在该方法中使用快捷键alt+insert,选中generateO2O,就是自动生成get,set代码,当然复杂的还需要稍作调整。
接下来附一个手动映射的代码:
源对象:
public class KmNode {
private Data Data;
private List<KmNode> Children;
public Data getData() {
return Data;
}
public void setData(Data data) {
Data = data;
}
public List<KmNode> getChildren() {
return Children;
}
public void setChildren(List<KmNode> children) {
Children = children;
}
}
其中的data为
public class Data {
private String Id;
private String Created;
private String Text;
private Integer Priority;
private String ExpandState;
private String Note;
private Integer Progress;
private String Image;
private String ImageTitle;
private ImageSize ImageSize;
private String Hyperlink;
private String HyperlinkTitle;
private String FontFamily;
private Integer FontSize;
private String FontWeight;
private String FontStyle;
private String Color;
private String Background;
}
其中的get,set 省略。
目标类型:
public class MmNode{
/**
* Attribute
*/
private String BackgroudColor;
private String Color;
private String Folded;
private String Id;
private String Link;
private String Position;
private String Style;
private String Text;
private String Created;
private String Modifyed;
private String Hgap;
private String Vgap;
private String Vshift;
private String EncryptedContent;
private Font Font;
private Icon Icon;
private RichContent RContent;
private List<MmNode> Node;
}
其中的get,set 省略。
KmNode--->MmNode,要求Mmnode中属性值来自于KmNode.data中的值,而且是树结构,节点中包含子节点。
映射的代码:
/***
* kmNode 转化为 mmNode
* @param mmNode
* @param kmNode
* @return
*/
public static MmNode toMmNode(MmNode mmNode, KmNode kmNode) {
var data = kmNode.getData();
if (data == null) {
return null;
}
mmNode.setId(data.getId());
mmNode.setCreated(data.getCreated());
mmNode.setModifyed(data.getCreated());
mmNode.setText(data.getText());
if (data.getPriority() != null && data.getPriority() > 0) {
mmNode.setIcon(new Icon(MessageFormat.format("full-{0}", data.getPriority())));
}
mmNode.setFolded(data.getExpandState() == "collapse" ? "true" : "false");
if (data.getImageSize() != null && data.getImage() != null) {
mmNode.setRContent(new RichContent(new Image(data.getImage(), data.getImageSize().getHeight().toString(), data.getImageSize().getWidth().toString())));
}
if (data.getFontSize() != null && data.getFontSize() > 0) {
mmNode.setFont(new Font(data.getFontWeight(), data.getFontStyle(), data.getFontFamily(), data.getFontSize().toString()));
}
mmNode.setLink(data.getHyperlink());
mmNode.setColor(data.getColor());
if (kmNode.getChildren().size() > 0) {
for (int i = 0; i < kmNode.getChildren().size(); i++) {
if (mmNode.getNode() == null || mmNode.getNode().size() == 0) {
mmNode.setNode(new ArrayList<>(kmNode.getChildren().size()));
}
mmNode.getNode().add(new MmNode());
mmNode.getNode().get(i).setPosition(Math.floorMod(i,2) == 0 ? "left" : "right");
toMmNode(mmNode.getNode().get(i), kmNode.getChildren().get(i));
}
}
return mmNode;
}
以上就完成两个对象之间的映射,比较复杂。java中mapper工具,无法实现。但是c#中的Automapper做的比较好,实现起来也挺简单的。感兴趣的可以尝试一下。