如何将流收集到 TreeMap 中

fra*_*chi 12 java treemap java-stream

我知道这是一个菜鸟问题,但我在其他任何地方都找不到简单的答案。问题是:我需要编写一个返回 a 的方法SortedMap,因此树图应该可以正常工作。我有一个HashMap< String, Skill>Skill该类具有方法getNamegetNumApplicants我需要返回一个SortedMap<String, Long>,以技能名称为键,以申请人数为值。这是我的立场:

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

public SortedMap<String, Long> skill_nApplicants() {

    return skillMap.values().stream().collect(...);
}
Run Code Online (Sandbox Code Playgroud)

这是技能课

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道这应该很容易,我只是很难理解这一切。

And*_*eas 17

不要HashMap先将数据收集到 a ,然后转换为TreeMap. TreeMap使用重载toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)方法将数据直接收集到 a ,该方法允许您指定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
    ));
}
Run Code Online (Sandbox Code Playgroud)

  • 有没有省略合并功能但指定地图供应商的功能? (3认同)
  • @francescofoschi 否。您可以在 javadoc 中亲自查看:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#i32 (2认同)