2016-05-24 5 views
3

私はDoctorsのコレクション(ハッシュマップとして)をジェネリックHospitalクラスに持っています。.collect(Collectors.toList())とJavaのストリーム

public class Doctor extends Person { 
    private int id; 
    private String specialization; 
    private List<Person> patients = new LinkedList<Person>(); 

私の目的は忙しい医師を返すこの関数を記述することです:私は、このようなクラスコード(患者に焦点)のようないくつかの情報を持っているそれぞれの医師について

Map<Integer, Doctor> doctors = new HashMap<Integer, Doctor>(); 

Aは医師平均よりも大きい患者の数。

この操作を実行するために上記のストリームを使用します。問題はcollectメソッドにあります。その使用時点でdoctorsWithManyPatientsList<Collection<Person>>であり、Collection<Doctor>ではないためです。どうすればいい?

すでにAvgPatientsPerDoctorがどこかで定義されているとします。 、あなたのケースのために

doctors 
    .values() 
    .stream() 
    .filter(d -> d.getPatients().size() >= AvgPatientsPerDoctor) 
    .collect(Collectors.toList()); 

map(doctor -> doctor.getPatients())戻りStream<List<Person>>を、あなたは再びfilter ING後と呼び出す前Stream<Doctor>に変換する必要があります

答えて

4

あなたが必要mapDoctor -> List<Person>)を使用しない、それがfilterに使用されます方法はcollectです。


最高の方法ではない方法があります。元のコレクションを変更することに注意してください。

doctors.values().removeIf(d -> d.getPatients().size() < AvgPatientsPerDoctor); 
+0

です。私は理解した。回答いただきありがとうございます。あなたが言及したように最終的にストリームにそれを変換する方法はありますか?それは本当にnedeedではなく、ただ知っている。 –

+1

@GiuseppeCanto、 'List 'を受け取り、 'Doctor'タイプの新しいオブジェクトを作成するコンストラクタ(またはメソッド名' creator')があれば、 – Andrew

+1

@GiuseppeCanto、 'map(this: :creator) 'または' map(リスト - > this.creator(リスト)) ' – Andrew

関連する問題