Dictionary 使用流进行映射时出错

Dictionary 使用流进行映射时出错,dictionary,java-8,java-stream,counting,collectors,Dictionary,Java 8,Java Stream,Counting,Collectors,我目前在弄清楚如何使用Java8流方面遇到了困难。 我正试图从lista_dottori(Map)到一个新的地图patientsPerSp,每个医学专业的位置(方法getspecification)我绘制了拥有该专业医生的患者数量(方法getPatients在classDoctor中返回该医生的患者的列表)。我不知道如何使用计数方法实现这一目的,而且我似乎在互联网上找不到任何关于这类问题的示例或解释 这就是我写的,它确实给了我计数部分的错误: public Collection<Strin

我目前在弄清楚如何使用Java8流方面遇到了困难。 我正试图从
lista_dottori
Map
)到一个新的地图
patientsPerSp
,每个医学专业的位置(方法
getspecification
)我绘制了拥有该专业医生的患者数量(方法
getPatients
在class
Doctor
中返回该医生的患者的
列表)。我不知道如何使用计数方法实现这一目的,而且我似乎在互联网上找不到任何关于这类问题的示例或解释

这就是我写的,它确实给了我计数部分的错误:

public Collection<String> countPatientsPerSpecialization(){
    patientsPerSp=
            lista_dottori.values().stream()
            .map(Doctor::getSpecialization)
            .collect(groupingBy(Doctor::getSpecialization, counting(Doctor::getPatients.size())))
            ;
}
public Collection countPatientsPerSpecialization(){
病人员=
lista_dottori.values().stream()
.map(医生::getSpecialization)
.collect(分组依据(医生::getSpecialization,计数(医生::getPatients.size()))
;
}

似乎您希望对患者列表的大小求和。这可以通过
summingit()
收集器来完成,而不是
counting()
(在这种情况下,它只计算发生次数;医生)。这里似乎不需要映射。因此您可以编写:

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 summingInt(doctor -> doctor.getPatients().size())));
请注意,如果多个医生都有同一个患者,则结果将不正确(这样会计算多次)。如果您的情况可能,那么最好将患者分成一组:

patientsPerSp = lista_dottori.values().stream()
        .collect(groupingBy(Doctor::getSpecialization, 
                 mapping(Doctor::getPatients(), toSet())));
通过这种方式,您将拥有一个映射专门化到患者集合的映射,因此此集合的大小将是您想要的计数。如果您只需要不带集合的计数,您可以通过
collecting and then()添加最后一步:


我解决了避免使用流的问题。这就是我使用的解决方案:

public Collection<String> countPatientsPerSpecialization(){

    int numSpec = 0;
    Map<String, Integer> spec = new HashMap<>();

    for(Doctor d : lista_dottori.values()){
        if(!spec.containsKey(d.getSpecialization())){
            spec.put(d.getSpecialization(), d.getPatients().size());
            numSpec++;
        }
        else{ //cioè se la specializzazione c'è già
            spec.replace(d.getSpecialization(), +d.getPatients().size()); 
        }
    }
    patientsPerSp.add(spec.keySet() + ": " + spec.values());
    for(String s : patientsPerSp)
        System.out.println(s);
    return patientsPerSp;
}
public Collection countPatientsPerSpecialization(){
int numSpec=0;
Map spec=newhashmap();
对于(医生d:lista_dottori.values()){
如果(!spec.containsKey(d.getSpecialization())){
spec.put(d.getSpecialization(),d.getPatients().size());
numSpec++;
}
否则{//cioèse la specializazione c'giá
规格替换(d.getSpecialization(),+d.getPatients().size());
}
}
patientsPerSp.add(spec.keySet()+”:“+spec.values());
for(字符串s:patientsPerSp)
系统输出打印项次;
返回病人组;
}
我似乎无法使用您的解决方案来解决问题,尽管它们被很好地公开了,抱歉。
无论如何,感谢您抽出时间回答

不要描述您的类。发布它们的代码。感谢您的回答,它解释得很好。它仍然给了我一些问题,它总是告诉我类型诊所有一个未定义的方法(它是类的名称).第一个是Summingit,第二个是toSet…我忘了导入一些东西吗?对不起,你的问题中没有关于
Clinic
类的内容,所以我不太可能在这里帮助你。如果问题仍然没有解决,那么最好单独问一个问题。
public Collection<String> countPatientsPerSpecialization(){

    int numSpec = 0;
    Map<String, Integer> spec = new HashMap<>();

    for(Doctor d : lista_dottori.values()){
        if(!spec.containsKey(d.getSpecialization())){
            spec.put(d.getSpecialization(), d.getPatients().size());
            numSpec++;
        }
        else{ //cioè se la specializzazione c'è già
            spec.replace(d.getSpecialization(), +d.getPatients().size()); 
        }
    }
    patientsPerSp.add(spec.keySet() + ": " + spec.values());
    for(String s : patientsPerSp)
        System.out.println(s);
    return patientsPerSp;
}