2016-11-05 13 views
7

मुझे तुम मेरे कोड दिखाने दें: getFooMultiMapCode() परसूची <Foo> से नक्शा करने के लिए <स्ट्रिंग, सूची <Foo>>: बेहतर कार्यान्वयन के लिए देख

कक्षा फू

public class Foo { 

    String code; 
    String value; 

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

मुख्य विधि (फोकस विधि):

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; 
} 
} 

मुख्य प्रिंट सही ढंग से थाई रों स्ट्रिंग:

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

मैं उदाहरण java8 के लिए उपयोग कर एक और अधिक लधु तरह से getFooMultiMapCode विधि के पुनर्लेखन के लिए चाहते हैं या भी इस तरह के lambdaj, अमरूद, आदि पुस्तकालयों लेकिन मैं विधि हस्ताक्षर बदलने के लिए नहीं करना चाहती

+3

गैर धारा संस्करण: '(फू फू: कम महत्वपूर्ण चीज़ें) के लिए। FooMultiMapCode.computeIfAbsent (foo.getCode(), एक्स -> नई ArrayList <>()) जोड़ने (foo);' – Holger

उत्तर

11

जावा 8 और groupingBy(classifier, downstream) साथ समाधान:

return foos.stream().collect(Collectors.groupingBy(Foo::getCode, Collectors.toList())); 

या @Boris the Spider रूप groupingBy(classifier) बस के साथ देखा:

return foos.stream().collect(Collectors.groupingBy(Foo::getCode)); 
+4

जावा 8 निश्चित रूप से मामूली रूप से है पिछले संस्करणों की तुलना में अधिक संक्षिप्त ... –

1

@Holgers टिप्पणी पर थोड़ा विस्तार करना: अगर आप छोरों पसंद करते हैं गैर-धारा संस्करण - अभी भी java8, हालांकि:

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

या यहाँ तक कि

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; 
} 

मैं अभी भी, धारा संस्करण पसंद करते हैं, हालांकि।

संबंधित मुद्दे