2016-03-21 4 views
6

Ich schreibe eine Methode, die eine Eingabe Map der Form Map<Term, List<Integer>> nimmt, wobei Term definiert ist here.Java 8 - Filterliste im Kartenwert

Methode:

  1. Go über die Tasten des Map und filtern sie ein Term Attribut.
  2. Für jede der übrigen Tasten, um die Größe der entsprechenden Liste, die Kappe auf 5 (min(List.size(), 5)) und die Ausgabe in eine globale var hinzufügen (sagen wir, totalSum)
  3. Return totalSum

Diese so weit ist das, was ich geschrieben habe:

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(); 

ich bin nicht in der Lage als Eingabe einen Strom von Listen zu nehmen, Ausgabe eine ganze Zahl für jede dieser Listen und gibt die Summe aller Ausgänge.

Ich kann es natürlich mit for-Schleifen schreiben, aber ich versuche Java 8 zu lernen und war neugierig, ob dieses Problem lösbar ist.

+1

Die 'Map'-Schnittstelle hat jetzt ihre eigene 'forEach()' - Methode, die eine 'BiConsumer'-Instanz verwendet. Dies kann verwendet werden, um Ihren Code zu vereinfachen. –

Antwort

11

Sie benötigen keine forEach Methode. Sie können map jeder Eintrag der Map zu einem int und sum diese ganzen Zahlen:

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

Der forEach Aufruf beendet den Stream. Sie können die Karte direkt ohne forEach verwenden.

2

Mit Eclipse Collections funktioniert das Folgende unter Verwendung von MutableMap und 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)); 

Hinweis: Ich bin ein Committer für Eclipse Collections.