/* package whatever; // don't place package name! */
 
import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.stream.Collectors;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static class Obj {
		private int value;
 
		public Obj
(int value, 
String category
) { 			this.value = value;
			this.category = category;
		}
 
		public int getValue() { return value; }
		public void setValue(int value) { this.value = value; }
 
		public String getCategory
() { return category
; }; 		public void setCategory
(String category
) {this.
category = category
; };  
 
		@Override
			return category + ":" + value;
		}
	}
 
	{
		List<Obj> list = new ArrayList<>();
		list.add(new Obj(500, "GROCERY"));
		list.add(new Obj(300, "GROCERY"));
		list.add(new Obj(100, "FUEL"));
		list.add(new Obj(300, "SMALL APPLIANCE REPAIR"));
		list.add(new Obj(200, "FUEL"));
 
		List<Obj> values = list.stream().collect(
        Collectors.groupingBy(Obj::getCategory, Collectors.reducing((a, b) -> new Obj(a.getValue() + b.getValue(), a.getCategory())))
    ).values().stream().map(Optional::get).collect(Collectors.toList());
 
	List<Obj> values2 = list.stream().sorted((o1, o2) -> o1.getCategory().compareTo(o2.getCategory()))
        .collect(LinkedList<Obj>::new, (ll, obj) -> {
              Obj last = null;
              if(!ll.isEmpty()) {
              	last = ll.getLast();
              }
 
              if (last == null || !last.getCategory().equals(obj.getCategory())) {
                ll.add(new Obj(obj.getValue(), obj.getCategory())); //deep copy here
              } else {
                last.setValue(last.getValue() + obj.getValue());
              }
            },
            (list1, list2) -> {
            });
 
 
		// your code goes here
	}
}
				LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CmltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CgovKiBOYW1lIG9mIHRoZSBjbGFzcyBoYXMgdG8gYmUgIk1haW4iIG9ubHkgaWYgdGhlIGNsYXNzIGlzIHB1YmxpYy4gKi8KY2xhc3MgSWRlb25lCnsKCXB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqIHsKCQlwcml2YXRlIGludCB2YWx1ZTsKCQlwcml2YXRlIFN0cmluZyBjYXRlZ29yeTsKCQkKCQlwdWJsaWMgT2JqKGludCB2YWx1ZSwgU3RyaW5nIGNhdGVnb3J5KSB7CgkJCXRoaXMudmFsdWUgPSB2YWx1ZTsKCQkJdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OwoJCX0KCQkKCQlwdWJsaWMgaW50IGdldFZhbHVlKCkgeyByZXR1cm4gdmFsdWU7IH0KCQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShpbnQgdmFsdWUpIHsgdGhpcy52YWx1ZSA9IHZhbHVlOyB9CgoJCXB1YmxpYyBTdHJpbmcgZ2V0Q2F0ZWdvcnkoKSB7IHJldHVybiBjYXRlZ29yeTsgfTsKCQlwdWJsaWMgdm9pZCBzZXRDYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHt0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7IH07CgogICAgICAgIAoJCUBPdmVycmlkZQoJCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CgkJCXJldHVybiBjYXRlZ29yeSArICI6IiArIHZhbHVlOwoJCX0KCX0KCQoJcHVibGljIHN0YXRpYyB2b2lkIG1haW4gKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCgl7CgkJTGlzdDxPYmo+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKCQlsaXN0LmFkZChuZXcgT2JqKDUwMCwgIkdST0NFUlkiKSk7CgkJbGlzdC5hZGQobmV3IE9iaigzMDAsICJHUk9DRVJZIikpOwoJCWxpc3QuYWRkKG5ldyBPYmooMTAwLCAiRlVFTCIpKTsKCQlsaXN0LmFkZChuZXcgT2JqKDMwMCwgIlNNQUxMIEFQUExJQU5DRSBSRVBBSVIiKSk7CgkJbGlzdC5hZGQobmV3IE9iaigyMDAsICJGVUVMIikpOwoJCQoJCUxpc3Q8T2JqPiB2YWx1ZXMgPSBsaXN0LnN0cmVhbSgpLmNvbGxlY3QoCiAgICAgICAgQ29sbGVjdG9ycy5ncm91cGluZ0J5KE9iajo6Z2V0Q2F0ZWdvcnksIENvbGxlY3RvcnMucmVkdWNpbmcoKGEsIGIpIC0+IG5ldyBPYmooYS5nZXRWYWx1ZSgpICsgYi5nZXRWYWx1ZSgpLCBhLmdldENhdGVnb3J5KCkpKSkKICAgICkudmFsdWVzKCkuc3RyZWFtKCkubWFwKE9wdGlvbmFsOjpnZXQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CgkJCglMaXN0PE9iaj4gdmFsdWVzMiA9IGxpc3Quc3RyZWFtKCkuc29ydGVkKChvMSwgbzIpIC0+IG8xLmdldENhdGVnb3J5KCkuY29tcGFyZVRvKG8yLmdldENhdGVnb3J5KCkpKQogICAgICAgIC5jb2xsZWN0KExpbmtlZExpc3Q8T2JqPjo6bmV3LCAobGwsIG9iaikgLT4gewogICAgICAgICAgICAgIE9iaiBsYXN0ID0gbnVsbDsKICAgICAgICAgICAgICBpZighbGwuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgCWxhc3QgPSBsbC5nZXRMYXN0KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIGlmIChsYXN0ID09IG51bGwgfHwgIWxhc3QuZ2V0Q2F0ZWdvcnkoKS5lcXVhbHMob2JqLmdldENhdGVnb3J5KCkpKSB7CiAgICAgICAgICAgICAgICBsbC5hZGQobmV3IE9iaihvYmouZ2V0VmFsdWUoKSwgb2JqLmdldENhdGVnb3J5KCkpKTsgLy9kZWVwIGNvcHkgaGVyZQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBsYXN0LnNldFZhbHVlKGxhc3QuZ2V0VmFsdWUoKSArIG9iai5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIChsaXN0MSwgbGlzdDIpIC0+IHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigicGFyYWxsZWwgZXZhbHVhdGlvbiBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgICAgIH0pOwoKCQkKCQlTeXN0ZW0ub3V0LnByaW50bG4odmFsdWVzKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4odmFsdWVzMik7CgkJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJfQp9