Как собрать поток в TreeMap - PullRequest
0 голосов
/ 01 сентября 2018

Я знаю, что это нубский вопрос, но я не мог найти простой ответ где-либо еще. Вопрос: мне нужно написать метод, который возвращает SortedMap, поэтому карта дерева должна работать нормально. У меня есть HashMap< String, Skill>, класс Skill имеет оба метода getName и getNumApplicants, и мне нужно вернуть SortedMap<String, Long> с именем навыка в качестве ключа и числом претендентов в качестве значения. Вот где я стою:

private Map<String,Skill> skillMap = new HashMap<>();

public SortedMap<String, Long> skill_nApplicants() {

    return skillMap.values().stream().collect(...);
}

Это класс навыков

public class Skill {

    private String name;
    private List <Position> reqPosition = new ArrayList<>();
    private Long numApplicants;

    public void plusOneApplicant() {
        this.numApplicants++;
    }

    public Long getNumApplicants() {
        return numApplicants;
    }
    public Skill(String name) {
        super();
        this.name = name;
        this.numApplicants = 0L;
    }
    public String getName() {
        return name;
        }

    public List<Position> getPositions() {
        return reqPosition;
        }
    public void addReqPosition(Position p) {
        this.reqPosition.add(p);
        return;
    }
}

Я знаю, что это должно быть очень легко, мне просто очень трудно понять все это.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Не собирайте данные сначала HashMap, затем , а затем преобразуйте в TreeMap. Соберите данные непосредственно в TreeMap, используя перегруженный метод toMap(keyMapper, valueMapper, mergeFunction, mapSupplier), который позволяет указать, какой Map создать (4-й параметр).

public SortedMap<String, Long> skill_nApplicants() {
    return skillMap.values().stream().collect(Collectors.toMap(
            Skill::getName,
            Skill::getNumApplicants,
            Math::addExact, // only called if duplicate names can occur
            TreeMap::new
    ));
}
0 голосов
/ 01 сентября 2018

Вот как вы можете это сделать

public SortedMap<String, Long> skill_nApplicants(Map<String, Skill> skillMap) {
    Map<String, Long> result = skillMap.values().stream().collect(Collectors.toMap(Skill::getName, Skill::getNumApplicants));
    return new TreeMap<>(result);
}
...