我有一个医生的集合(作为hashmap),进入一个通用的医院类。
Map<Integer, Doctor> doctors = new HashMap<Integer, Doctor>();
对于每位医生,我都有一些信息,例如课堂代码(专注于患者):
public class Doctor extends Person {
private int id;
private String specialization;
private List<Person> patients = new LinkedList<Person>();
我的目的是编写这个功能,让繁忙的医生回归:医生的病人数量大于平均水平。
/**
* returns the collection of doctors that has a number of patients larger than the average.
*/
Collection<Doctor> busyDoctors(){
Collection<Doctor> doctorsWithManyPatients =
doctors.values().stream()
.map( doctor -> doctor.getPatients() )
.filter( patientsList -> { return patientsList.size() >= AvgPatientsPerDoctor; })
.collect(Collectors.toList());
return null;
}
我想使用上面的流来执行此操作。问题出在collect
方法中,因为在该使用点doctorsWithManyPatients
的类型为List<Collection<Person>>
而非Collection<Doctor>
。我怎么能这样做?
假设AvgPatientsPerDoctor
已在某处定义。
答案 0 :(得分:4)
您无需使用map
(Doctor -> List<Person>
),它将在filter
中使用:
doctors
.values()
.stream()
.filter( d -> d.getPatients().size() >= AvgPatientsPerDoctor)
.collect(Collectors.toList());
对于您的情况,map( doctor -> doctor.getPatients() )
会返回Stream<List<Person>>
,您应该在Stream<Doctor>
之后和调用filter
方法之前将其再次转换为collect
。
有一种不同的方式不是最好的方式。请记住,它会更改原始集合。
doctors.values().removeIf(d -> d.getPatients().size() < AvgPatientsPerDoctor);