/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
{
//--------------------- Test Data ---------------------
List
<DummyObj
> dataToBeAdded
= new ArrayList
<>(List.
of( new DummyObj("uuid1", "abcd", "mer1", 20D),
new DummyObj("uuid1", "pqrs", "mer1", 25D),
new DummyObj("uuid2", "xyz", "mer1", 18D)
));
List
<DummyObj
> dataToBeSubtracted
= new ArrayList
<>(List.
of( new DummyObj("uuid1", "abcd", "mer1", 5D),
new DummyObj("uuid1", "pqrs", "mer1", 2D),
new DummyObj("uuid3", "xyz", "mer2", 10D)
));
//--------------------- Original Code ---------------------
Map
<String, DummyObj
> dataToBeAddedMap
= dataToBeAdded.
stream() .collect(Collectors.toMap(obj -> obj.getAttr1() + obj.getAttr2() + obj.getAttr3(), item -> item));
Map
<String, DummyObj
> dataToBeSubtractedMap
= dataToBeSubtracted.
stream() .collect(Collectors.toMap(obj -> obj.getAttr1() + obj.getAttr2() + obj.getAttr3(),
item -> new DummyObj(item.getAttr1(), item.getAttr2(), item.getAttr3(), -1 * item.getAttr4())));
Map
<String, DummyObj
> resultantData
= Stream.
of(dataToBeAddedMap, dataToBeSubtractedMap
) .flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
(v1, v2) -> new DummyObj(v1.getAttr1(), v1.getAttr2(), v1.getAttr3(), v1.getAttr4() + v2.getAttr4())
));
System.
out.
println("Output w Original Solution: "); for (DummyObj obj: resultantData.values()){
}
//--------------------- Optimized Version ---------------------
Map
<String, DummyObj
> mapRes
= Stream.
concat(dataToBeAdded.
stream(), dataToBeSubtracted.
stream().
map(obj
-> { obj.setAttr4(-1 * obj.getAttr4());
return obj;
}))
.
collect(Collectors.
toMap(obj
-> String.
format("%s%s%s", obj.
getAttr1(), obj.
getAttr2(), obj.
getAttr3()),
Function.identity(),
(obj1, obj2) -> new DummyObj(obj1.getAttr1(), obj1.getAttr2(), obj1.getAttr3(), obj1.getAttr4() + obj2.getAttr4())
));
System.
out.
println("\nOutput w Optimized Solution: "); for (DummyObj obj: mapRes.values()){
}
}
static class DummyObj {
private String attr1, attr2, attr3
;
this.attr1 = attr1;
this.attr2 = attr2;
this.attr3 = attr3;
this.attr4 = attr4;
}
return attr1;
}
public void setAttr1
(String attr1
) { this.attr1 = attr1;
}
return attr2;
}
public void setAttr2
(String attr2
) { this.attr2 = attr2;
}
return attr3;
}
public void setAttr3
(String attr3
) { this.attr3 = attr3;
}
return attr4;
}
public void setAttr4
(Double attr4
) { this.attr4 = attr4;
}
@Override
return String.
format("%s %s %s %g", attr1, attr2, attr3, attr4
); }
}
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwppbXBvcnQgamF2YS51dGlsLkxpc3Q7CmltcG9ydCBqYXZhLnV0aWwuTWFwOwppbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOwppbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRlc3QgRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBMaXN0PER1bW15T2JqPiBkYXRhVG9CZUFkZGVkID0gbmV3IEFycmF5TGlzdDw+KExpc3Qub2YoCiAgICAgICAgICAgICAgICBuZXcgRHVtbXlPYmooInV1aWQxIiwgImFiY2QiLCAibWVyMSIsIDIwRCksCiAgICAgICAgICAgICAgICBuZXcgRHVtbXlPYmooInV1aWQxIiwgInBxcnMiLCAibWVyMSIsIDI1RCksCiAgICAgICAgICAgICAgICBuZXcgRHVtbXlPYmooInV1aWQyIiwgInh5eiIsICJtZXIxIiwgMThEKQogICAgICAgICkpOwoKICAgICAgICBMaXN0PER1bW15T2JqPiBkYXRhVG9CZVN1YnRyYWN0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oTGlzdC5vZigKICAgICAgICAgICAgICAgIG5ldyBEdW1teU9iaigidXVpZDEiLCAiYWJjZCIsICJtZXIxIiwgNUQpLAogICAgICAgICAgICAgICAgbmV3IER1bW15T2JqKCJ1dWlkMSIsICJwcXJzIiwgIm1lcjEiLCAyRCksCiAgICAgICAgICAgICAgICBuZXcgRHVtbXlPYmooInV1aWQzIiwgInh5eiIsICJtZXIyIiwgMTBEKQogICAgICAgICkpOwoKICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPcmlnaW5hbCBDb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIE1hcDxTdHJpbmcsIER1bW15T2JqPiBkYXRhVG9CZUFkZGVkTWFwID0gZGF0YVRvQmVBZGRlZC5zdHJlYW0oKQogICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChvYmogLT4gb2JqLmdldEF0dHIxKCkgKyBvYmouZ2V0QXR0cjIoKSArIG9iai5nZXRBdHRyMygpLCBpdGVtIC0+IGl0ZW0pKTsKCiAgICAgICAgTWFwPFN0cmluZywgRHVtbXlPYmo+IGRhdGFUb0JlU3VidHJhY3RlZE1hcCA9IGRhdGFUb0JlU3VidHJhY3RlZC5zdHJlYW0oKQogICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChvYmogLT4gb2JqLmdldEF0dHIxKCkgKyBvYmouZ2V0QXR0cjIoKSArIG9iai5nZXRBdHRyMygpLAogICAgICAgICAgICAgICAgICAgICAgICBpdGVtIC0+IG5ldyBEdW1teU9iaihpdGVtLmdldEF0dHIxKCksIGl0ZW0uZ2V0QXR0cjIoKSwgaXRlbS5nZXRBdHRyMygpLCAtMSAqIGl0ZW0uZ2V0QXR0cjQoKSkpKTsKCiAgICAgICAgTWFwPFN0cmluZywgRHVtbXlPYmo+IHJlc3VsdGFudERhdGEgPSBTdHJlYW0ub2YoZGF0YVRvQmVBZGRlZE1hcCwgZGF0YVRvQmVTdWJ0cmFjdGVkTWFwKQogICAgICAgICAgICAgICAgLmZsYXRNYXAobWFwIC0+IG1hcC5lbnRyeVNldCgpLnN0cmVhbSgpKQogICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcCgKICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5OjpnZXRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTo6Z2V0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICh2MSwgdjIpIC0+IG5ldyBEdW1teU9iaih2MS5nZXRBdHRyMSgpLCB2MS5nZXRBdHRyMigpLCB2MS5nZXRBdHRyMygpLCB2MS5nZXRBdHRyNCgpICsgdjIuZ2V0QXR0cjQoKSkKICAgICAgICAgICAgICAgICkpOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk91dHB1dCB3IE9yaWdpbmFsIFNvbHV0aW9uOiAiKTsKICAgICAgICBmb3IgKER1bW15T2JqIG9iajogcmVzdWx0YW50RGF0YS52YWx1ZXMoKSl7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihvYmopOwogICAgICAgIH0KCgogICAgICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9wdGltaXplZCBWZXJzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIE1hcDxTdHJpbmcsIER1bW15T2JqPiBtYXBSZXMgPSBTdHJlYW0uY29uY2F0KGRhdGFUb0JlQWRkZWQuc3RyZWFtKCksIGRhdGFUb0JlU3VidHJhY3RlZC5zdHJlYW0oKS5tYXAob2JqIC0+IHsKICAgICAgICAgICAgICAgICAgICBvYmouc2V0QXR0cjQoLTEgKiBvYmouZ2V0QXR0cjQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChvYmogLT4gU3RyaW5nLmZvcm1hdCgiJXMlcyVzIiwgb2JqLmdldEF0dHIxKCksIG9iai5nZXRBdHRyMigpLCBvYmouZ2V0QXR0cjMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uLmlkZW50aXR5KCksCiAgICAgICAgICAgICAgICAgICAgICAgIChvYmoxLCBvYmoyKSAtPiBuZXcgRHVtbXlPYmoob2JqMS5nZXRBdHRyMSgpLCBvYmoxLmdldEF0dHIyKCksIG9iajEuZ2V0QXR0cjMoKSwgb2JqMS5nZXRBdHRyNCgpICsgb2JqMi5nZXRBdHRyNCgpKQogICAgICAgICAgICAgICAgKSk7CgogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXG5PdXRwdXQgdyBPcHRpbWl6ZWQgU29sdXRpb246ICIpOwogICAgICAgIGZvciAoRHVtbXlPYmogb2JqOiBtYXBSZXMudmFsdWVzKCkpewogICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ob2JqKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGNsYXNzIER1bW15T2JqIHsKICAgICAgICBwcml2YXRlIFN0cmluZyBhdHRyMSwgYXR0cjIsIGF0dHIzOwogICAgICAgIHByaXZhdGUgRG91YmxlIGF0dHI0OwoKICAgICAgICBwdWJsaWMgRHVtbXlPYmooU3RyaW5nIGF0dHIxLCBTdHJpbmcgYXR0cjIsIFN0cmluZyBhdHRyMywgRG91YmxlIGF0dHI0KSB7CiAgICAgICAgICAgIHRoaXMuYXR0cjEgPSBhdHRyMTsKICAgICAgICAgICAgdGhpcy5hdHRyMiA9IGF0dHIyOwogICAgICAgICAgICB0aGlzLmF0dHIzID0gYXR0cjM7CiAgICAgICAgICAgIHRoaXMuYXR0cjQgPSBhdHRyNDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cjEoKSB7CiAgICAgICAgICAgIHJldHVybiBhdHRyMTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHIxKFN0cmluZyBhdHRyMSkgewogICAgICAgICAgICB0aGlzLmF0dHIxID0gYXR0cjE7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF0dHIyKCkgewogICAgICAgICAgICByZXR1cm4gYXR0cjI7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyMihTdHJpbmcgYXR0cjIpIHsKICAgICAgICAgICAgdGhpcy5hdHRyMiA9IGF0dHIyOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdHRyMygpIHsKICAgICAgICAgICAgcmV0dXJuIGF0dHIzOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHZvaWQgc2V0QXR0cjMoU3RyaW5nIGF0dHIzKSB7CiAgICAgICAgICAgIHRoaXMuYXR0cjMgPSBhdHRyMzsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBEb3VibGUgZ2V0QXR0cjQoKSB7CiAgICAgICAgICAgIHJldHVybiBhdHRyNDsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHI0KERvdWJsZSBhdHRyNCkgewogICAgICAgICAgICB0aGlzLmF0dHI0ID0gYXR0cjQ7CiAgICAgICAgfQoKICAgICAgICBAT3ZlcnJpZGUKICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMgJXMgJXMgJWciLCBhdHRyMSwgYXR0cjIsIGF0dHIzLCBhdHRyNCk7CiAgICAgICAgfQogICAgfQp9