2017-10-10 16 views
0

Je filtre deux flux et effectue une division au milieu, mais à la fin je ne peux pas collecter mon résultat dans une liste. Pouvez-vous s'il vous plaît me dire ce que je fais mal?Impossible d'enregistrer le résultat dans la liste <Long> après avoir manipulé deux flux

Voici le code que j'ai

List<Long> average_population = total_population.stream() 
    .flatMapToLong(a-> number_of_cities.stream().mapToLong(b-> b/a)) 
    .collect(null, Collectors.toList()); <- error 

Voici l'erreur que je reçois sur la dernière ligne.

La méthode Collect (fournisseur, ObjLongConsumer, BiConsumer) dans le type LongStream est pas applicable pour les arguments (null, Collector>) Incompatibilité de type: ne peut pas convertir Collector> à ObjLongConsumer

Répondre

1

LongStream.collect nécessite 3 paramètres. Vous êtes probablement pour cela:

List<Long> average_population = 
    total_population.stream() 
    .flatMapToLong(a -> number_of_cities.stream().mapToLong(b -> b/a)) 
    .collect(ArrayList::new, ArrayList::add, ArrayList::addAll); 

Mais en fait, coller à Long ne vous apporte pas beaucoup d'avantages, il sera plus simple à écrire en utilisant flatMap, qui vous permettra d'utiliser un simple collect aussi:

List<Long> average_population = 
    total_population.stream() 
    .flatMap(a -> number_of_cities.stream().map(b -> b/a)) 
    .collect(Collectors.toList()); 
1

Si vous souhaitez collecter les résultats dans un List<Long> vous devez boîte les valeurs. Le flatMapToLong donne un LongStream qui donne la primitive long, non encadrée Long. Vous pouvez créer des objets encadrés à partir du long flux avec l'opérateur .boxed().

LongStream.of(1l, 2l, 3l).boxed().collect(Collectors.toList()); 

donc je suppose qu'il deviendrait:

List<Long> average_population = total_population.stream() 
     .flatMapToLong(a -> number_of_cities.stream().mapToLong(b -> b/a)) 
     .boxed() 
     .collect(Collectors.toList());