Java 如何使用流计算元素数

Java 如何使用流计算元素数,java,java-stream,Java,Java Stream,我需要在arraylist中加载文件数据,这是我通过创建一个方法完成的。如何通过创建单独的计数方法来计算使用streams的学生人数。我有一个包含构造函数、getter和setter的学生类 我有一个包含数据的文件 姓名:a 科目:英语、物理、化学 姓名:b 科目:数学、生物 //name是学生类中的变量//getName是getter List stu=new ArrayList(): 公共静态映射名(列表名,谓词getName){ Map n=stu.stream() .filter(get

我需要在arraylist中加载文件数据,这是我通过创建一个方法完成的。如何通过创建单独的计数方法来计算使用streams的学生人数。我有一个包含构造函数、getter和setter的学生类

我有一个包含数据的文件

姓名:a

科目:英语、物理、化学

姓名:b

科目:数学、生物

//name是学生类中的变量//getName是getter

List stu=new ArrayList():
公共静态映射名(列表名,谓词getName){
Map n=stu.stream()
.filter(getName)
.collect(Collectors.groupingBy(e->e.getName(),Collectors.counting());
System.out.println(collector.counting());
返回n;
}

它应该只显示学生人数。

因为您坚持使用流(当然不建议使用列表中的元素数量):

公共静态整数计数(学生列表){
long count=listOfStudents.stream().count();
int n=数学toIntExact(计数);
返回n;
}
由于
Stream.count()
返回一个
long
,您的方法必须返回一个
long
,我发现这是毫无意义的,因为我们知道a列表不能容纳比
int
更多的学生;或者我们需要从
long
转换为
int
。我正在使用
Math.toIntExact
进行转换

注释是正确的:建议使用
listOfStudents.size()
(并且没有流)

你在问题中的方法似乎是数一数同名的学生。在您的示例中,结果可能是
{a=1,b=1}
。但只有当两个学生都满足谓词的条件时,谓词才会传递给方法


小贴士:注意在你的程序中使用名字,这对可读性有很大的影响。调用您的方法,例如
count
getNumberOfStudents
(而不是
names
)。调用保存列表的参数,例如
students
studentList
(而不是
name
)。不要像调用getter一样调用谓词(谓词和getter是两种完全不同的东西)。另外,返回值的
n
实际上没有告诉我们任何事情,让我们想知道您希望该方法返回什么。这不仅仅是为了我们(尽管取悦其他堆垛者是获得好答案的一种既好又便宜的方式);我认为好的名字也有助于你保持对该计划的清晰思考。

不太清楚,你想数的是什么?如果您希望显示学生总数,为什么不使用
stu.size()
?另一点是,如果
getName
过滤特定的名称,
groupingBy
使用名称在您只想
计算使用流的学生人数时没有意义。我不必考虑科目。只需使用
stu.size()
计算学生人数。。。另一个-
System.out.println(Collectors.counting())也不会有什么帮助。所以对于您问题中的示例数据,计数应该是2?因为有两个学生的数据。或者你想计算完成给定谓词的学生数吗?
List<Student> stu = new ArrayList<>():


public static Map<String,Long> names(List<Student> name, Predicate <Student> getName) {      
    Map<String, Long> n  = stu.stream()
    .filter(getName)    
    .collect(Collectors.groupingBy(e -> e.getName(),Collectors.counting()));
    System.out.println(Collectors.counting());
    return n;
}
public static int count(List<Student> listOfStudents) {
    long count = listOfStudents.stream().count();
    int n = Math.toIntExact(count);
    return n;
}