У меня есть список объектов Ob
определяется какУменьшают коллекцию объектов по общему полю в Java-8
class Ob {
private String type;
private List<String> attire;
// standard getter and setters
public Ob (String type){
this.type=type;
}
public Ob addAttrire(String att){
if(attire == null){
attire = new ArrayList<>();
}
attire.add(att);
return this;
}
}
я получаю объекты как
[{
"type" : "upper"
attires : [{"t1","t2"}]
},
{
"type" : "upper"
attires : ["t3","t4"]
},
{
"type" : "lower"
attires : ["l1","l2"]
}]
, который я должен сочетать в
[{
"type" : "upper"
attires : ["t1","t2","t3","t4"]
},{
"type" : "lower"
attires : ["l1","l2"]
}]
Как использовать поток для этого. Уменьшает помощь? Поток можно использовать,
List<Ob> coll = new ArrayList<>();
coll.add(new Ob("a").addAttrire("1").addAttrire("2").addAttrire("3"));
coll.add(new Ob("a").addAttrire("1").addAttrire("2").addAttrire("3"));
coll.add(new Ob("a").addAttrire("1").addAttrire("2").addAttrire("3"));
coll.add(new Ob("b").addAttrire("1").addAttrire("2").addAttrire("3"));
coll.add(new Ob("b").addAttrire("1").addAttrire("2").addAttrire("3"));
coll.add(new Ob("b").addAttrire("1").addAttrire("2").addAttrire("3"));
Collection<Ob> values = coll.stream()
.collect(toMap(Ob::getType, Function.identity(), (o1, o2) -> {
o1.getAttire().addAll(o2.getAttire());
return o1;
})).values();
Обновленный вопрос с раствором Ruben. Нет необходимости удалять дубликаты, но это можно сделать, используя набор в Ob для наряда. Нынешнее решение работало безупречно.
О ваш комментарий на Rubens ответ «* Что рекомендуемый способ в таком случае с влиянием на производительность *» Я думаю, что в нет большой разницы в производительности исполнения. Если производительность оказывается проблемой, я думаю, что лучше переписать код, используя цикл, который даст вам больше контроля. Я думаю, что решение Rubens имеет преимущество, потому что оно немного короче и проще. Я считаю, что у меня есть преимущество, потому что оно не изменяет оригинальные «Ob's» и, следовательно, более функционально. – Lii