如何将流收集到 TreeMap 中
How to collect a stream into a TreeMap
我知道这是一个菜鸟问题,但我在其他任何地方都找不到简单的答案。问题是:我需要编写一个 return 是 SortedMap
的方法,因此树形图应该可以正常工作。
我有一个 HashMap< String, Skill>
,Skill
class 有两个方法 getName
和 getNumApplicants
,我需要 return 一个 SortedMap<String, Long>
,以技能名称为键,申请人数为值。这就是我的立场:
private Map<String,Skill> skillMap = new HashMap<>();
public SortedMap<String, Long> skill_nApplicants() {
return skillMap.values().stream().collect(...);
}
这就是技能class
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;
}
}
我知道这应该很容易,我只是很难理解这一切。
这是你可以做到的
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);
}
不要先将数据收集到 HashMap
,然后 转换为 TreeMap
。使用重载的 toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)
方法将数据直接收集到 TreeMap
,该方法允许您指定要创建的 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
));
}
如果您没有任何值将被映射到与另一个值相同的键,那么您可以完全避免使用收集器(因此您不需要考虑合并功能) .
您需要做的就是简单地将每个技能添加到地图上 forEach
:
public SortedMap<String, Long> skill_nApplicants() {
Map<String, Long> result = new TreeMap<>();
skillMap.values()
.forEach((skill) -> result.put(skill.getName(), skill.getNumApplicants());
return result;
}
如果你想 return 一个不可修改的地图,你可以用 Collections.unmodifiableSortedMap
包裹 result
。
我知道这是一个菜鸟问题,但我在其他任何地方都找不到简单的答案。问题是:我需要编写一个 return 是 SortedMap
的方法,因此树形图应该可以正常工作。
我有一个 HashMap< String, Skill>
,Skill
class 有两个方法 getName
和 getNumApplicants
,我需要 return 一个 SortedMap<String, Long>
,以技能名称为键,申请人数为值。这就是我的立场:
private Map<String,Skill> skillMap = new HashMap<>();
public SortedMap<String, Long> skill_nApplicants() {
return skillMap.values().stream().collect(...);
}
这就是技能class
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;
}
}
我知道这应该很容易,我只是很难理解这一切。
这是你可以做到的
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);
}
不要先将数据收集到 HashMap
,然后 转换为 TreeMap
。使用重载的 toMap(keyMapper, valueMapper, mergeFunction, mapSupplier)
方法将数据直接收集到 TreeMap
,该方法允许您指定要创建的 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
));
}
如果您没有任何值将被映射到与另一个值相同的键,那么您可以完全避免使用收集器(因此您不需要考虑合并功能) .
您需要做的就是简单地将每个技能添加到地图上 forEach
:
public SortedMap<String, Long> skill_nApplicants() {
Map<String, Long> result = new TreeMap<>();
skillMap.values()
.forEach((skill) -> result.put(skill.getName(), skill.getNumApplicants());
return result;
}
如果你想 return 一个不可修改的地图,你可以用 Collections.unmodifiableSortedMap
包裹 result
。