2016-11-05 18 views
7

Sana kodumu gösterelim: getFooMultiMapCode() üzerineHaritaya <String, List <Foo>>: Daha iyi bir uygulaması arıyorsanız

Sınıf Foo

public class Foo { 

    String code; 
    String value; 

    public Foo(String code, String value) { 
     super(); 
     this.code = code; 
     this.value = value; 
    } 
    // getters/setters 
} 

Ana yöntem (odak yöntem):

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); 
    System.out.println(fooCodeMap); 
} 

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()); 
     if(list==null){ 
      list = new ArrayList<Foo>(); 
      list.add(foo); 
      fooMultiMapCode.put(foo.getCode(), list); 
     } 
     else { 
      list.add(foo); 
     } 
    } 
    return fooMultiMapCode; 
} 
} 

Ana baskı doğru olarak doğru s dize:

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

Ben örnek java8 için kullanarak daha succint şekilde getFooMultiMapCode yöntemi yeniden yazmak ister ya da böyle lambdaj, guava, vb kütüphaneler ama yöntem imzasını değiştirmek istemiyoruz ederim.

+3

Akış olmayan varyant: 'için (foo foo: foos) fooMultiMapCode.computeIfAbsent (foo.getCode(), x -> yeni ArrayList <>()) ekleyin (foo); – Holger

cevap

1

bir @Holgers yorumum biraz genişletilmesi: Eğer döngüler tercih ediyorsanız Sigara akışı sürümünü - yine de java8, yine de:

veya hatta

private static Map<String, List<Foo>> getFooMultiMapCode(List<Foo> foos) { 
    Map<String, List<Foo>> fooMultiMapCode = new HashMap<String, List<Foo>>(); 
    foos.forEach(foo -> fooMultiMapCode.computeIfAbsent(foo.getCode(), x -> new ArrayList<>()).add(foo)); 
    return fooMultiMapCode; 
} 

Yine de stream versiyonunu tercih ediyorum.

İlgili konular