2016-03-21 60 views
6

içindeki Filtre listesi Bir Termhere tanımlanır formun Map<Term, List<Integer>> bir girdi Map götüren bir yöntem yazıyorum.Java 8 - Harita değeri

Yöntem:

  1. Map konusu linklerin Git ve Term özniteliğini kullanarak bunları filtre. Kalan tuşların her biri için
  2. , Return
  3. (totalSum, diyelim ki) totalSum

Bu 5 (min(List.size(), 5)) için kap, ilgili listenin boyutunu almak ve küresel var çıktı eklemek

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

Ben girdi olarak listelerin bir akışı, çıkış bu listelerin her biri için bir tamsayı almak ve tüm çıkışların toplamını iade alamıyorum: Şimdiye kadar yazdım budur.

Açıkçası döngüler için yazabilirim ama Java 8'i öğrenmeye çalışıyorum ve bu sorunun çözülebilir olup olmadığını merak ettim.

+1

"Map" arabiriminin artık bir "BiCumumer" örneğini alan kendi "forEach()" yöntemi vardır. Bu, kodunuzu basitleştirmek için kullanılabilir. –

cevap

11

forEach yöntemine ihtiyacınız yoktur. Bir int için Map her giriş map can ve sum bu tamsayılar:

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

forEach çağırma akışı sona erer. Haritayı forEach olmadan doğrudan kullanabilirsiniz.

2

Eclipse Collections ile, aşağıdaki MutableMap ve IntList kullanarak çalışır.

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

Not: Eclipse Koleksiyonları için bir veriyorum.