2016-03-24 20 views
4

kullanarak bir akışta "paralel" listelere katılma "parallelStream()" 'de oluşturulan birleştirme listelerinde sorun yaşıyorum. Ben "int" değerler bu çiftlerin her itibaren Toplama()

  • , ben bir "parallelStream()"
  • istediğim kullanarak List<Edge> elde ediyorum çiftleri içeren bir List<Pair> var

    • : İşte durumdur & bir içine bu listeleri katılmak toplamak için List<Edge>

    ben yapmak istiyorum ne "birleşti" (ve bunu this answer son mermi noktasında şu işe bekleniyor) follo olduğu kanat:

    List<Edge> edges = pairs.parallelStream() 
         .map(p -> align(p.first(), p.second())) 
         .collect(ArrayList::new, List::add, List::addAll); 
    

    (Ben ilk etapta bunu "parallelize" gerekir neden olan) CPU yoğun işleri yapıyor ve bir List<Edge> dönen align() ile.

    collect() kullanımı derleme aşağıdaki hatayı vererek beni engelleyen

    :

    : Yapmak başardınız

    Error: java: incompatible types: cannot infer type-variable(s) R,E (argument mismatch; invalid method reference incompatible types: ArrayList< Edge > cannot be converted to int)

    Not benzer (ama "çirkin" imo) sürümleri, işe bana daha karıştırır hangi

    v1:

    List<List<Edge>> collect = pairs.parallelStream() 
         .map(p -> align(p.first(), p.second())) 
         .collect(Collectors.toList()); 
    collect.forEach(l -> l.forEach(edges::add)); 
    

    v2:

    List<Edge> edges = new ArrayList<>(); 
    pairs.parallelStream() 
         .map(p -> align(p.first(), p.second())) 
         .collect(Collectors.toList()).forEach(edges::addAll); 
    

    Birisi bana yardım edebilir mi? Ben vazgeçmeden ve "v2" kullanmaktan kaçınmak istiyoruz;

  • cevap

    5

    % 100 net değil) ama muhtemelen istediğiniz gibi görünüyor

    List<Edge> edges = pairs.parallelStream() 
        .flatMap(p -> align(p.first(), p.second()).stream()) 
        .collect(Collectors.toList()); 
    
    +1

    Anlaşmalı; tercih etmeme rağmen, bu durumda, .map (p -> align (p.first(), p.second())). flatMap (Collection :: stream) ':) – fge

    +1

    zaten açık bir lambda yazıyorsanız, oradaki '.stream()' çağrısını da katlayabilirsiniz; Bir yöntem referansı kullanıyor olsaydım, farklı hissedebilirdim. –

    +1

    Eh, bunu anlayabilirim; ancak bir şekilde çok fazla "lambda kodu" yazmayı reddediyorum ve bu nedenle bu kodu olabildiğince az tutmayı amaçlıyoruz. Ve evet, bu bir duygu da, – fge

    2

    Ayrıca olarak List::addAll ile List::add değiştirerek bu sorunu giderebilirsiniz ikinci argüman collect: