2016-05-24 2 views
3

У меня есть коллекция (как hashmap) of the Doctors, в общий класс больницы..collect (Collectors.toList()) и потоки по Java-методу

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 уже определен где-то.

ответ

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); 
+0

Вы правы. Я понял. Спасибо за ответ. Есть способ в конечном итоге преобразовать его в Stream , как вы упомянули? На самом деле это не совсем, а просто знать. –

+1

@GiuseppeCanto, если у вас есть конструктор (или метод - назовите его как «создатель»), который получает «List » и создает новый объект типа «Doctor» – Andrew

+1

@GiuseppeCanto, тогда вы можете написать «map (this: : creator) 'или' map (list -> this.creator (list)) ' – Andrew

Смежные вопросы