2015-07-06 2 views
4

Например, у меня есть класс StudentКак преобразовать карту в SortedMap по лямбда-выражению в JAVA8?

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

    public int getAge(){ 
     return this.age; 
    } 
} 

А класс School:

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())); 
    } 
} 

Метод countingByAge просить возвращения в SortedMap<Integer,Long >, ключ возраст студента, значение является количество учеников в отдельный возраст, т. е. мне нужно подсчитать, сколько учеников в возрасте.

Я почти закончил метод, но я не знаю, как преобразовать Map<Integer,Long> в SortedMap<Integer,Long> без (SortedMap<Integer,Long>) литья.

+0

, на мой взгляд, вы можете просто бросить его. Я не вижу ничего плохого в использовании этого сценария. – BufBills

+2

@BufBills Нельзя просто бросить его. Компилятор Java генерирует предупреждение для этого, по уважительной причине. Неконтролируемое кастинг подрывает способность компилятора гарантировать правильный безопасный код, в котором используются типично типизированные объекты. – VGR

+3

@VGR: в этом случае это не * непроверенный * литой. Это просто бросок, который не работает во время выполнения, поскольку «Карта», возвращаемая сборщиком 'grouping' по умолчанию, не является« SortedMap ». – Holger

ответ

9

Вы можете использовать groupingBy(classifier, mapFactory, downstream) и, как mapFactory передача Поставщик возвращения экземпляр карты реализации SortedMap как TreeMap::new

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

BTW, так как @Holgermentioned in comment вы можете упростить

map.entrySet() 
.stream() 
.map(Map.Entry::getValue) 

с

map.values() 
.stream() 
+6

'entrySet(). Stream(). Map (Map.Entry :: getValue)' является излишне сложным способом выражения 'values ​​(). Stream()' ... – Holger

+0

@Holger Я не хотел менять многие вещи в OP-коде, но да, это было бы приятным упрощением. – Pshemo

+1

Вы могли бы добавить его в качестве альтернативы, так как ответ не так долго, что он отвлечет читателя ... – Holger

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