2016-03-21 13 views
6

मैं एक विधि लिख रहा हूं जो Map<Term, List<Integer>> के Map इनपुट इनपुट लेता है जहां Termhere परिभाषित किया गया है।जावा 8 - मानचित्र मूल्य के अंदर फ़िल्टर सूची

विधि:

Map की चाबियाँ पर
  1. जाओ और एक Term विशेषता का उपयोग कर उन्हें फ़िल्टर।
  2. शेष चाबियों का प्रत्येक के लिए, इसी सूची के आकार वापसी totalSum

यह मिलता है, यह 5 (min(List.size(), 5)) करने के लिए टोपी और एक वैश्विक वर के लिए उत्पादन को जोड़ने (जैसे कि, totalSum)

  • inputMap 
        .entrySet() 
        .stream() 
        .filter(entry -> entry.getKey().field().equals(fieldName)) // Keep only terms with fieldName 
        .forEach(entry -> entry.getValue() 
         .map(size -> Math.min(entry.getValue().size(), 5))) // These 2 lines do not work 
         .sum(); 
    

    मैं इनपुट के रूप में सूचियों की एक धारा, उत्पादन उन सूचियों से प्रत्येक के लिए एक पूर्णांक लेने के लिए और सभी outputs की राशि वापस करने में असमर्थ हूँ: मैं अब तक क्या लिखा है।

    मैं स्पष्ट रूप से छोरों के लिए उपयोग कर लिख सकते हैं, लेकिन मैं जावा 8 जानने की कोशिश कर रहा हूँ और अगर इस समस्या को इसे प्रयोग व्याख्या करने योग्य है उत्सुक था।

  • +1

    'मानचित्र' इंटरफ़ेस में अब अपनी 'forEach()' विधि है जो 'BiConsumer' उदाहरण लेती है। इसका उपयोग आपके कोड को सरल बनाने के लिए किया जा सकता है। –

    उत्तर

    11

    आपको forEach विधि की आवश्यकता नहीं है। आप कर सकते हैं map एक int को Map की प्रत्येक प्रविष्टि, और sum उन पूर्णांकों:

    int sum = inputMap 
        .entrySet() 
        .stream() 
        .filter(entry -> entry.getKey().field().equals(fieldName)) 
        .mapToInt(entry -> Math.min(entry.getValue().size(), 5)) 
        .sum(); 
    
    0

    foreach मंगलाचरण धारा समाप्त हो जाता है। आप बिना किसी के सीधे नक्शे का उपयोग कर सकते हैं।

    2

    Eclipse Collections के साथ, निम्नलिखित MutableMap और IntList का उपयोग कर काम करेंगे।

    MutableMap<Term, IntList> inputMap = 
        Maps.mutable.of(term1, IntLists.mutable.of(1, 2, 3), 
            term2, IntLists.mutable.of(4, 5, 6, 7)); 
    
    long sum = inputMap 
        .select((term, intList) -> term.field().equals(fieldName)) 
        .sumOfInt(intList -> Math.min(intList.size(), 5)); 
    

    नोट: मैं ग्रहण संग्रह के लिए एक committer हूँ।

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