如何在JAVA8中通过lambda表达式将映射转换为SortedMap?

如何在JAVA8中通过lambda表达式将映射转换为SortedMap?,java,java-8,java-stream,Java,Java 8,Java Stream,例如,我有一个班级Student public class Student{ private String name; private int age; public int getAge(){ return this.age; } } 还有一个班级学校: public class School{ private Map<String,Student> students=new TreeMap<>();

例如,我有一个班级
Student

public class Student{
    private String name;
    private int age;

    public int getAge(){
        return this.age;
    }
}
还有一个班级
学校

public class School{
    private Map<String,Student> students=new TreeMap<>();
    //stroe the index of students in the school by key is their names.

    public SortedMap<Integer,Long> countingByAge(){
        return this.students.entrySet().stream().map(s->s.getValue())
               .collect(groupingBy((Student s)->s.getAge(),counting()));
    }
}
公立学校{
私有映射学生=新树映射();
//全校学生的索引是他们的名字。
公共分类地图计数方式(){
返回此.students.entrySet().stream().map(s->s.getValue())
.collect(分组方式((学生)->s.getAge(),counting());
}
}
countingByAge方法要求返回
分类地图
,关键是学生的年龄,值是每个不同年龄的学生人数,即我需要计算每个年龄的学生人数

我几乎完成了该方法,但我不知道如何将
Map
转换为
SortedMap
,而无需
(SortedMap)
铸造。

您可以使用并作为
mapFactory
传递Map实现
SortedMap
的供应商返回实例,如
TreeMap::new

public SortedMap<Integer, Long> countingByAge(){
    return  students.entrySet()
            .stream()
            .map(Map.Entry::getValue)
            .collect(groupingBy(Student::getAge, TreeMap::new, counting()));
}


依我看,你可以直接投。在这个场景中,我看不出使用cast有任何错误。@BufBills仅仅使用cast是不好的。Java编译器为此生成了一个警告,这是有充分理由的。未经检查的强制转换会破坏编译器在使用泛型类型对象时保证正确、安全代码的能力。@VGR:在这种情况下,它不是未经检查的强制转换。这只是一个在运行时会失败的强制转换,因为默认的
分组
收集器返回的
Map
不是
SortedMap
entrySet().stream().Map(Map.Entry::getValue)
是一种说
values().stream()不必要的复杂方式
…@Holger我不想在OP code中更改很多内容,但是,是的,这将是一个很好的简化。您可以添加它作为替代,因为答案不会太长,会分散读者的注意力…@Holger Done。如果你认为我的答案可以改进/简化,以后请随意编辑。我相信你的判断,尤其是关于Java-8问题的判断。
map.entrySet()
.stream()
.map(Map.Entry::getValue)
map.values()
.stream()