操作两个流后无法将结果保存到List <long>

时间:2017-10-10 17:54:44

标签: java lambda collections

我正在过滤两个流并在中间进行分割,但最后我无法将结果收集到List中。你能告诉我我做错了吗?

这是我的代码

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

这是我在最后一行得到的错误。

  

LongStream类型中的方法collect(Supplier,ObjLongConsumer,BiConsumer)不适用于参数(null,Collector&gt;)       类型不匹配:无法从收集器转换&gt;致ObjLongConsumer

2 个答案:

答案 0 :(得分:1)

LongStream.collect需要3个参数。 你可能正在寻找这个:

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

但实际上,坚持Long并没有给你带来多少好处, 使用flatMap编写会更简单, 这将允许您使用更简单的collect

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

答案 1 :(得分:1)

如果您想在List<Long>中收集结果,则需要设置值。 flatMapToLong提供LongStream,其中包含原始long,而不是Long。您可以使用.boxed()运算符从长流中制作盒装对象。

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

所以我猜它会变成:

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