fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.function.Function;
  10. import java.util.stream.Collectors;
  11. import java.util.stream.Stream;
  12.  
  13. /* Name of the class has to be "Main" only if the class is public. */
  14. class Ideone
  15. {
  16. public static void main (String[] args) throws java.lang.Exception
  17. {
  18. //--------------------- Test Data ---------------------
  19. List<DummyObj> dataToBeAdded = new ArrayList<>(List.of(
  20. new DummyObj("uuid1", "abcd", "mer1", 20D),
  21. new DummyObj("uuid1", "pqrs", "mer1", 25D),
  22. new DummyObj("uuid2", "xyz", "mer1", 18D)
  23. ));
  24.  
  25. List<DummyObj> dataToBeSubtracted = new ArrayList<>(List.of(
  26. new DummyObj("uuid1", "abcd", "mer1", 5D),
  27. new DummyObj("uuid1", "pqrs", "mer1", 2D),
  28. new DummyObj("uuid3", "xyz", "mer2", 10D)
  29. ));
  30.  
  31. //--------------------- Original Code ---------------------
  32. Map<String, DummyObj> dataToBeAddedMap = dataToBeAdded.stream()
  33. .collect(Collectors.toMap(obj -> obj.getAttr1() + obj.getAttr2() + obj.getAttr3(), item -> item));
  34.  
  35. Map<String, DummyObj> dataToBeSubtractedMap = dataToBeSubtracted.stream()
  36. .collect(Collectors.toMap(obj -> obj.getAttr1() + obj.getAttr2() + obj.getAttr3(),
  37. item -> new DummyObj(item.getAttr1(), item.getAttr2(), item.getAttr3(), -1 * item.getAttr4())));
  38.  
  39. Map<String, DummyObj> resultantData = Stream.of(dataToBeAddedMap, dataToBeSubtractedMap)
  40. .flatMap(map -> map.entrySet().stream())
  41. .collect(Collectors.toMap(
  42. Map.Entry::getKey,
  43. Map.Entry::getValue,
  44. (v1, v2) -> new DummyObj(v1.getAttr1(), v1.getAttr2(), v1.getAttr3(), v1.getAttr4() + v2.getAttr4())
  45. ));
  46.  
  47. System.out.println("Output w Original Solution: ");
  48. for (DummyObj obj: resultantData.values()){
  49. System.out.println(obj);
  50. }
  51.  
  52.  
  53. //--------------------- Optimized Version ---------------------
  54. Map<String, DummyObj> mapRes = Stream.concat(dataToBeAdded.stream(), dataToBeSubtracted.stream().map(obj -> {
  55. obj.setAttr4(-1 * obj.getAttr4());
  56. return obj;
  57. }))
  58. .collect(Collectors.toMap(obj -> String.format("%s%s%s", obj.getAttr1(), obj.getAttr2(), obj.getAttr3()),
  59. Function.identity(),
  60. (obj1, obj2) -> new DummyObj(obj1.getAttr1(), obj1.getAttr2(), obj1.getAttr3(), obj1.getAttr4() + obj2.getAttr4())
  61. ));
  62.  
  63. System.out.println("\nOutput w Optimized Solution: ");
  64. for (DummyObj obj: mapRes.values()){
  65. System.out.println(obj);
  66. }
  67. }
  68.  
  69. static class DummyObj {
  70. private String attr1, attr2, attr3;
  71. private Double attr4;
  72.  
  73. public DummyObj(String attr1, String attr2, String attr3, Double attr4) {
  74. this.attr1 = attr1;
  75. this.attr2 = attr2;
  76. this.attr3 = attr3;
  77. this.attr4 = attr4;
  78. }
  79.  
  80. public String getAttr1() {
  81. return attr1;
  82. }
  83.  
  84. public void setAttr1(String attr1) {
  85. this.attr1 = attr1;
  86. }
  87.  
  88. public String getAttr2() {
  89. return attr2;
  90. }
  91.  
  92. public void setAttr2(String attr2) {
  93. this.attr2 = attr2;
  94. }
  95.  
  96. public String getAttr3() {
  97. return attr3;
  98. }
  99.  
  100. public void setAttr3(String attr3) {
  101. this.attr3 = attr3;
  102. }
  103.  
  104. public Double getAttr4() {
  105. return attr4;
  106. }
  107.  
  108. public void setAttr4(Double attr4) {
  109. this.attr4 = attr4;
  110. }
  111.  
  112. @Override
  113. public String toString() {
  114. return String.format("%s %s %s %g", attr1, attr2, attr3, attr4);
  115. }
  116. }
  117. }
Success #stdin #stdout 0.18s 54092KB
stdin
Standard input is empty
stdout
Output w Original Solution: 
uuid1 pqrs mer1 23.0000
uuid3 xyz mer2 -10.0000
uuid2 xyz mer1 18.0000
uuid1 abcd mer1 15.0000

Output w Optimized Solution: 
uuid1 pqrs mer1 23.0000
uuid3 xyz mer2 -10.0000
uuid2 xyz mer1 18.0000
uuid1 abcd mer1 15.0000