如何在流API中实现匿名比较器,更准确地说是sorted()?

时间:2017-07-05 12:10:17

标签: java java-stream

我有一个Doctor类和类Doctor(cd)的对象集合, 每个医生里面都有一个病人集合,我需要根据病人数量对医生进行分类,并按照他们的姓名和病人数量返回字符串集合,所以这是我的代码:

    Collection <String> output;
    output = cd.stream()
               .sorted(new Comparator<Doctor>(){
                    @Override
                    public int compare(Doctor d1, Doctor d2){
                    return d1.getPatients().size()-d2.getPatients().size();}})
            .map(String.format("%d : %s %s", d->d.getPatients().size, d.getName, d.getSurname))
            .collect(Collectors.toList());

所以我的问题是上面的代码是否正确,如果不实现Comparable接口可以做得更好吗?你也可以帮我使用String.format部分代码,那里有些不对劲。

由于

Edit1 很抱歉,有关String.format()的不确定性,Eclipse说:

  • d无法解析为变量

1 个答案:

答案 0 :(得分:2)

Comparator中有一个方便的comparing方法,可以省去手动编写比较器的费用。

你可以像这样使用它:

output = cd.stream()
           .sorted(Comparator.comparing(d -> d.getPatients().size()))
...

Holger指出,由于您要比较int,因此您可能更愿意使用comparingInt代替comparing

对于格式化部分,map需要一个函数(d -> ...表示的意思),而format的参数应该只是值,而不是函数。

所以你可以使用以下方式进行格式化:

           .map(d -> String.format("%d : %s %s", d.getPatients().size(), d.getName(), d.getSurname()))