List 实现并行流以获取所有学生详细信息

List 实现并行流以获取所有学生详细信息,list,parallel-processing,java-8,java-stream,List,Parallel Processing,Java 8,Java Stream,我写了一个服务来获取全班学生的完整信息。该服务运行良好,但问题是获取完整的详细信息所需的时间太长。我的代码如下所示 List<StudentsDetails> allStudentsDetails = Lists.newArrayList(); List<ClassDetails> allClassDetailsDetails = getAllClassDetails(); allClassDetailsDetails.forEach(classDetailsDeta

我写了一个服务来获取全班学生的完整信息。该服务运行良好,但问题是获取完整的详细信息所需的时间太长。我的代码如下所示

List<StudentsDetails> allStudentsDetails = Lists.newArrayList();

List<ClassDetails> allClassDetailsDetails = getAllClassDetails();

allClassDetailsDetails.forEach(classDetailsDetails-> {
    StudentsDetails studentsDetails = new StudentsDetails();
    studentsDetails.setClassName(classDetailsDetails.getClassName());
    List<Student> allStudents = studentService.getAllStudentsByClass(classDetailsDetails.getClassName());
    studentsDetails.setAllStudents(allStudents);        
    allStudentsDetails.add(studentsDetails);
});
List allStudentsDetails=Lists.newArrayList();
List allClassDetailsDetails=getAllClassDetails();
所有classDetailsDetails.forEach(classDetailsDetails->{
StudentsDetails StudentsDetails=新学生详细信息();
setClassName(classDetailsDetails.getClassName());
List allStudents=studentService.getAllStudentsByClass(classDetailsDetails.getClassName());
学生详细信息。设置所有学生(所有学生);
所有学生详细信息。添加(学生详细信息);
});
我的问题


在这个场景中使用Java8并行流好吗?这真的提高了性能吗?我如何用这种方法实现并行流。

这就是并行化操作的方式,但是性能优势无法保证,因为它还依赖于外部数据库

Function<ClassDetails, StudentsDetails> fetchStudentDetials = classDetailsDetails -> {
    StudentsDetails studentsDetails = new StudentsDetails();
    studentsDetails.setClassName(classDetailsDetails.getClassName());
    List<Student> allStudents = studentService.getAllStudentsByClass(classDetailsDetails.getClassName());
    studentsDetails.setAllStudents(allStudents);
    return studentsDetails;
};

List<StudentsDetails> allStudentsDetails = allClassDetailsDetails
        .parallelStream()
        .map(fetchStudentDetials)
        .collect(toList());
函数fetchStudentDetials=classDetailsDetails->{
StudentsDetails StudentsDetails=新学生详细信息();
setClassName(classDetailsDetails.getClassName());
List allStudents=studentService.getAllStudentsByClass(classDetailsDetails.getClassName());
学生详细信息。设置所有学生(所有学生);
返回学生详细信息;
};
列出所有学生详细信息=所有课堂详细信息详细信息
.parallelStream()
.map(获取学生资料)
.collect(toList());

代码慢来自数据库访问

首先,应该为数据库编制索引

第二,如果您的学生数据库不是很高,我建议您一次性获取:

List<Student> findStudentByClassNameIn(List<String> classNames);
List findstudentbysclassnamein(List classNames);
然后把你的学生映射到你的班级

// Map class name with its student
Map<String, List<Student>> stdMap = listStudents().stream().collect(groupingBy(Student::getClassName), toList());

List<StudentsDetails> allStudentsDetails = allClassDetailsDetails.stream()
        .parallel()
        .map(c -> new StudentDetails(stdMap.get(c.getClassName()))
        .collect(toList());
//将类名与其学生映射
Map stdMap=listStudents().stream().collect(groupingBy(Student::getClassName),toList());
List allStudentsDetails=allClassDetailsDetails.stream()
.parallel()
.map(c->newstudentdetails(stdMap.get(c.getClassName()))
.collect(toList());
第三,如果您的学生数据太大,无法一次性获取,那么请分解以一次获取30个班级的数据。

试试我的库。它应该比原始问题中的代码快几十倍:

List<StudentsDetails> allStudentsDetails = StreamEx.of(allClassDetailsDetails).parallel(maxThreadNum) // genernally maxThreadNum = 30 is a good choice.
    .map(c -> new StudentsDetails(c.getClassName(), studentService.getAllStudentsByClass(c.getClassName())))
    .toList();
List allStudentsDetails=streamx.of(allClassDetailsDetails.parallel(maxtreadnum)//通常maxtreadnum=30是一个不错的选择。
.map(c->new StudentsDetails(c.getClassName(),studentService.getAllStudentsByClass(c.getClassName()))
.toList();

测试它。但不确定它是否能带来更好的性能,因为我相信性能不足通常来自数据层而不是应用层。感谢您的回答……在我的方法中,实现并行流是否有任何副作用……不。另外请注意,并行流只有在您拥有大量收集或长时间运行时才有好处ng任务。请看
@Mạ新罕布什尔州奎伊ế唐古伊ễn
不得不说。虽然在他的解决方案中不需要
并行
,因为
类细节
的数量相当少。