I have a object named EntityObjectDTO like below:
JavaScript
x
public @Data class EntityObjectDTO {
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Data
public static class Attributes {
private String name;
private AttributeType attributeType;
private String dataType;
}
}
This AttributeType is an enum and can have values (RAW,REFERRED,ORIGINAL).
I am trying to store all the attributes names and dataType into Hashmap of String key and value.
This DataType can be duplicate as well.
Input:
JavaScript
EntityObjectDTO obj= new EntityObjectDTO ();
obj.getAttributes().setName("name1");
obj.getAttributes().setAttributeType(REFERRED);
obj.getAttributes().setDataType("Vehicle");
obj.getAttributes().setName("name2");
obj.getAttributes().setAttributeType(REFERRED);
obj.getAttributes().setDataType("Vehicle");
obj.getAttributes().setName("name3");
obj.getAttributes().setAttributeType(REFERRED);
obj.getAttributes().setDataType("Person");
Expected in a HashMap:
{“Vehicle”,”name1,name2″}
{“Person”,”name3″}
This is what I tried:
JavaScript
Map<String, String> myMap = obj.getAttributes().stream()
.filter(entity -> AttributeType.REFERRED.equals(entity.getAttributeType()))
.collect(Collectors.toMap(EntityObjectDTO.Attributes::getDataType, e -> e.getName()));<br/>
But by this I am getting : java.lang.IllegalStateException: Message : Duplicate key Vehicle (attempted merging values name1 and name2)
How do I achieve the expected output by doing some modifications in existing code?
Advertisement
Answer
I assume your EntityObjectDTO
as below,
JavaScript
public class EntityObjectDTO {
private Attributes attributes;
public Attributes getAttributes() {
return attributes;
}
public void setAttributes(Attributes attributes) {
this.attributes = attributes;
}
}
and Attributes
as below,
JavaScript
public class Attributes {
private String name;
private String dataType;
private AttributeType attributeType;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDataType() {
return dataType;
}
public void setDataType(String dataType) {
this.dataType = dataType;
}
public AttributeType getAttributeType() {
return attributeType;
}
public void setAttributeType(AttributeType attributeType) {
this.attributeType = attributeType;
}
}
Then the below is fine to you,
JavaScript
public static void main(String[] args) {
EntityObjectDTO obj= new EntityObjectDTO ();
Attributes attributes = new Attributes();
attributes.setName("name1");
attributes.setDataType("Vehicle");
attributes.setAttributeType(AttributeType.REFERRED);
obj.setAttributes(attributes);
Attributes attributes1 = new Attributes();
attributes1.setName("name2");
attributes1.setDataType("Vehicle");
attributes1.setAttributeType(AttributeType.REFERRED);
obj.setAttributes(attributes1);
Attributes attributes2 = new Attributes();
attributes2.setName("name3");
attributes2.setDataType("Person");
attributes2.setAttributeType(AttributeType.REFERRED);
obj.setAttributes(attributes2);
List<Attributes> list = List.of(attributes1, attributes2, attributes);
Map<String, String> collect = list.stream()
.filter(e -> AttributeType.REFERRED.equals(e.getAttributeType()))
.collect(Collectors.groupingBy(Attributes::getDataType,
Collectors.mapping(Attributes::getName,
Collectors.joining(","))));
System.out.println(collect);
}
Please note that i used separate class.