使用Java8 Stream计算列表中的对象数

时间:2015-10-11 23:57:39

标签: java java-8 java-stream

所以我试图仅使用Stream计算ArrayList中的对象数。 我正在使用 stream.count ,但这只是返回1 ,因为我的列表包含多个对象。这是一些代码:

 static ArrayList<Person> people = new ArrayList<>();

  void loadCourses(){ // putting Person objects in the list }

  public void countPeople()
{
    Stream<ArrayList<Person>> stream1 = Stream.of(people); 
    long l = stream1.count();
    System.out.println("Number of people loaded: " + l);

}

感谢任何帮助:)

2 个答案:

答案 0 :(得分:6)

您使用的是Stream<ArrayList<Person>>而不是Stream<Person>

你想:

long l = people.stream().count();

您收到1,因为只有一个ArrayList

另请注意,您不需要此流。你可以people.size()

答案 1 :(得分:2)

作为@PaulBoddington的补充回答:我强烈建议您只使用people.size()。在Java-8中,当您使用people.stream().count()之类的流执行此操作时,它实际上会遍历整个Collection。所以这段代码有效地运作如下:

long count = 0;
for(Person p : people) count++;
return count;

对于大型收藏品来说,这可能会非常缓慢。相比之下,people.size()只返回ArrayList内存储的大小字段的值。

此问题已在Java-9代码中修复(请参阅JDK-8067969),但此修补程序未向后移植到Java-8。