2016-03-21 22 views
6

Piszę metodę, która pobiera dane wejściowe Map z formularza , gdzie jest zdefiniowane jako here.Java 8 - Lista filtrów wewnątrz wartości mapy

Metoda:

  1. Go nad klawiszami na Map i filtrować je za pomocą atrybutu Term.
  2. Dla każdego z pozostałych klawiszy uzyskać rozmiaru odpowiedniej listy, cap to do 5 (min(List.size(), 5)) i dodać wynik do globalnego var (powiedzmy, totalSum)
  3. Return totalSum

ten to, co napisałem do tej pory:

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

jestem w stanie wziąć na wejściu strumień list, wyjście liczbę całkowitą dla każdego z tych list i zwraca sumę wszystkich wyjść.

Oczywiście mogę to napisać przy użyciu pętli, ale próbuję nauczyć się języka Java 8 i byłem ciekawy, czy ten problem można rozwiązać, używając go.

+1

Interfejs 'Map' ma teraz własną metodę' forEach() ', która pobiera instancję' BiConsumer'. Może to być wykorzystane do uproszczenia kodu. –

Odpowiedz

11

Nie potrzebujesz metody forEach. te mogą map każdego wpisu Map do int i sum wy całkowitymi:

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

foreach wywołanie kończy strumienia. Możesz użyć mapy bezpośrednio bez forEach.

2

Z Eclipse Collections, następujące będą działać przy użyciu MutableMap i 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)); 

Uwaga: Jestem uczestnikiem kolekcji Eclipse.