user6904265 user6904265 - 1 year ago 90
Java Question

From List<Foo> to Map<String, List<Foo>>: looking for a better implementation

Let me show you my code:

Class Foo

public class Foo {

String code;
String value;

public Foo(String code, String value) {
this.code = code;
this.value = value;

public String getCode() {
return code;

public void setCode(String code) {
this.code = code;

public String getValue() {
return value;

public void setValue(String value) {
this.value = value;

public String toString(){
return value;

Main method (focus on getFooMultiMapCode() method):

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FooMain {

public static void main(String[] args) {
Foo foo1 = new Foo("100","foo1");
Foo foo2 = new Foo("200","foo2");
Foo foo3 = new Foo("300","foo3");
Foo foo4 = new Foo("100","foo4");
Foo foo5 = new Foo("100","foo5");
Foo foo6 = new Foo("200","foo6");
List<Foo> foos = Arrays.asList(foo1,foo2,foo3,foo4,foo5,foo6);
Map<String,List<Foo>> fooCodeMap = getFooMultiMapCode(foos);

private static Map<String, List<Foo>> getFooMultiMapCode(List<Foo> foos) {
Map<String, List<Foo>> fooMultiMapCode = new HashMap<String, List<Foo>>();
for(Foo foo:foos){
List<Foo> list = fooMultiMapCode.get(foo.getCode());
list = new ArrayList<Foo>();
fooMultiMapCode.put(foo.getCode(), list);
else {
return fooMultiMapCode;


Main prints correctly this string:

{100=[foo1, foo4, foo5], 200=[foo2, foo6], 300=[foo3]}

I would like to rewrite
method in a more succint way using for example java8 or also libraries such lambdaj, guava, etc but i don't want to change method signature.
Any ideas?

Answer Source

The solution with Java 8 and groupingBy(classifier, downstream):

return, Collectors.toList()));

Or simply with groupingBy(classifier) as @Boris the Spider noticed:

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download