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()"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ızError: 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;
Anlaşmalı; tercih etmeme rağmen, bu durumda, .map (p -> align (p.first(), p.second())). flatMap (Collection :: stream) ':) – fge
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. –
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