2016-03-21 18 views
6

Sto scrivendo un metodo che accetta un input Map del modulo Map<Term, List<Integer>> in cui è definito un Termhere.Java 8 - Elenco filtri all'interno del valore della mappa

Metodo:

  1. andare oltre le chiavi del Map e filtrare utilizzando un attributo Term.
  2. Per ognuno dei tasti rimanenti, ottenere la dimensione della lista corrispondente, cap a 5 (min(List.size(), 5)) e aggiungere l'uscita di una var globale (ad esempio, totalSum)
  3. ritorno totalSum

Questo è quello che ho scritto finora:

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

non sono in grado di prendere in input un flusso di liste, in uscita un numero intero per ciascuno di tali elenchi e restituire la somma di tutte le uscite.

posso, ovviamente, scrivere utilizzando cicli for, ma sto cercando di imparare Java 8 ed era curioso di sapere se questo problema è risolvibile utilizzarlo.

+1

L'interfaccia 'Map' ha ora il metodo proprio' forEach() 'che prende un'istanza' BiConsumer'. Questo può essere usato per semplificare il tuo codice. –

risposta

11

Non è necessario il metodo forEach. È possibile map ogni voce del Map a un int, e sum quei numeri interi:

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

L'invocazione forEach termina il flusso. Puoi usare la mappa direttamente senza forEach.

2

Con Eclipse Collections, quanto segue funziona con MutableMap e 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)); 

Nota: sono responsabile per le raccolte Eclipse.