1,在实际开发中,可能会遇到各种奇怪的业务需求。现在将遇到的其中一种情况分享出来看看。
固定内容的两个枚举,存在关联性,父子关联。希望输出 树形结构数据。
- 包装对象
package model.enums;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
@Data
public class ItemEum {
private List<ItemEum> ch =new ArrayList<>();
private Integer code;
private String remark;
private String name;
@Override
public String toString() {
return "ItemEum{" +
"ch=" + ch +
", code=" + code +
", remark='" + remark + '\'' +
", name='" + name + '\'' +
'}';
}
}
- 父枚举
package model.enums;
import com.alibaba.fastjson.JSONObject;
import java.util.Arrays;
public enum MessageTypeEnum {
ORDER(1, "订单提醒","ORDER"),
REFUND(2, "退款提醒","REFUND"),
AFTERSALE(3, "售后提醒","AFTERSALE"),
COUPON(4, "优惠券提醒","COUPON"),
ACTIVITY(5, "活动通知","ACTIVITY"),
COMMENT(6, "评论通知","COMMENT");
private Integer code;
private String remark;
private String name;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
MessageTypeEnum(Integer code, String remark, String name) {
this.code = code;
this.remark = remark;
this.name = name;
}
public static Boolean getMessageTyFlagByName(String Name) {
return Arrays.stream(MessageTypeEnum.values()).anyMatch(i->i.getName().equals(Name));
}
public static ItemEum getItemEumByName(String Name) {
ItemEum itemEum = new ItemEum();
Arrays.stream(MessageTypeEnum.values()).forEach(i->{
if(i.getName().equals(Name)){
itemEum.setRemark(i.getRemark());
itemEum.setName(Name);
itemEum.setCode(i.getCode());
}
});
return itemEum;
}
public static void main(String[] args) {
System.out.println(JSONObject.toJSON(ChildTypeEnum.getChildTypeEnumList()));
}
}
- 子枚举
package model.enums;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* zzx
*/
public enum ChildTypeEnum {
ORDER(10, "订单提醒",MessageTypeEnum.ORDER.name()),
ORDER2(20, "订单提醒2",MessageTypeEnum.ORDER.name()),
REFUND(30, "退款提醒",MessageTypeEnum.REFUND.name()),
REFUND2(40, "退款提醒2",MessageTypeEnum.REFUND.name()),
AFTERSALE(50, "售后提醒",MessageTypeEnum.AFTERSALE.name()),
AFTERSALE2(60, "售后提醒2",MessageTypeEnum.AFTERSALE.name()),
COUPON(70, "优惠券提醒",MessageTypeEnum.COUPON.name()),
COUPON2(80, "优惠券提醒2",MessageTypeEnum.COUPON.name()),
ACTIVITY(90, "活动通知",MessageTypeEnum.ACTIVITY.name()),
ACTIVITY2(100, "活动通知2",MessageTypeEnum.ACTIVITY.name()),
COMMENT(110, "评论通知",MessageTypeEnum.COMMENT.name()),
COMMENT2(120, "评论通知2",MessageTypeEnum.COMMENT.name());
private Integer code;
private String remark;
private String name;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
ChildTypeEnum(Integer code, String remark, String name) {
this.code = code;
this.remark = remark;
this.name = name;
}
public static ItemEum getChildItemEum(Integer code){
ItemEum itemEum = new ItemEum();
Arrays.stream(ChildTypeEnum.values()).forEach(i->{
if(i.getCode().equals(code)){
itemEum.setRemark(i.getRemark());
itemEum.setName(i.getName());
itemEum.setCode(i.getCode());
}
});
return itemEum;
}
public static List<ItemEum> getChildTypeEnumList() {
final List<ItemEum> li = new ArrayList<>();
Arrays.stream(ChildTypeEnum.values()).forEach(s->{
if(MessageTypeEnum.getMessageTyFlagByName(s.getName())){
// 获取一级权益
if(!li.stream().anyMatch(an->an.getName().equals(s.getName()))){
li.add(MessageTypeEnum.getItemEumByName(s.getName()));
}
//组装二级权益
li.stream().forEach(l->{
if(l.getName().equals(s.getName())){
l.getCh().add(getChildItemEum(s.getCode()));
}
});
}
});
return li.stream().sorted(Comparator.comparing(ItemEum::getName)
.thenComparing(ItemEum::getCode)
.thenComparing(ItemEum::getRemark)).collect(Collectors.toList());
}
}
执行main 方法后,得到的数据结构如下:
[{
"code": 1,
"ch": [{
"code": 10,
"ch": [],
"name": "ORDER",
"remark": "订单提醒"
}, {
"code": 20,
"ch": [],
"name": "ORDER",
"remark": "订单提醒2"
}],
"name": "ORDER",
"remark": "订单提醒"
}, {
"code": 2,
"ch": [{
"code": 30,
"ch": [],
"name": "REFUND",
"remark": "退款提醒"
}, {
"code": 40,
"ch": [],
"name": "REFUND",
"remark": "退款提醒2"
}],
"name": "REFUND",
"remark": "退款提醒"
}, {
"code": 3,
"ch": [{
"code": 50,
"ch": [],
"name": "AFTERSALE",
"remark": "售后提醒"
}, {
"code": 60,
"ch": [],
"name": "AFTERSALE",
"remark": "售后提醒2"
}],
"name": "AFTERSALE",
"remark": "售后提醒"
}, {
"code": 4,
"ch": [{
"code": 70,
"ch": [],
"name": "COUPON",
"remark": "优惠券提醒"
}, {
"code": 80,
"ch": [],
"name": "COUPON",
"remark": "优惠券提醒2"
}],
"name": "COUPON",
"remark": "优惠券提醒"
}, {
"code": 5,
"ch": [{
"code": 90,
"ch": [],
"name": "ACTIVITY",
"remark": "活动通知"
}, {
"code": 100,
"ch": [],
"name": "ACTIVITY",
"remark": "活动通知2"
}],
"name": "ACTIVITY",
"remark": "活动通知"
}, {
"code": 6,
"ch": [{
"code": 110,
"ch": [],
"name": "COMMENT",
"remark": "评论通知"
}, {
"code": 120,
"ch": [],
"name": "COMMENT",
"remark": "评论通知2"
}],
"name": "COMMENT",
"remark": "评论通知"
}]