.collect(Collectors.toList())和Java方法上的Streams

时间:2016-05-24 16:35:29

标签: java java-8 java-stream

我有一个医生的集合(作为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已在某处定义。

1 个答案:

答案 0 :(得分:4)

您无需使用mapDoctor -> 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);