如何将 List<Person> 转换为 Map<String, List<Double>> 而不是 Map<String, List<Person>>?
How to convert List<Person> to Map<String, List<Double>> instead of Map<String, List<Person>>?
考虑到 Person
class 有三个字段 name(String), age(int), salary(double)。
我想创建一个以名称为键,以薪水为值的映射(而不是 Person
对象本身),如果键不是唯一的,则使用 linkedList 来保存所有值重复键。
我指的是下面给出的link中给出的解决方案:
在 Java 8 中惯用地从 Stream 创建多值 Map
但仍然不清楚如何创建以 Salary 作为值的 hashmap。
我可以用 forEach() 创建 map<String, List<Double>>
。代码如下:
List<Person> persons= new ArrayList<>();
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
Map<String, List<Double>> personsByName = new HashMap<>();
persons.forEach(person ->
personsByName.computeIfAbsent(person.getName(), key -> new LinkedList<>())
.add(person.getSalary())
);
但我正在尝试使用 "groupingBy & collect" 创建地图。
如果我们想要 Person
对象本身作为值,那么代码如下:
Map<String, List<Person>> personsByNameGroupingBy = persons.stream()
.collect(Collectors.groupingBy(Person::getName, Collectors.toList()));
但我想创建一个以薪水为值的地图,如下所示:
Map<String, List<Double>>
如何实现这个场景?
您可以使用 Collectors.mapping
将 Person
个实例映射到相应的薪水:
Map<String, List<Double>> salariesByNameGroupingBy =
persons.stream()
.collect(Collectors.groupingBy(Person::getName,
Collectors.mapping(Person::getSalary,
Collectors.toList())));
创建一个 Map 然后做一个 forEach,对于每个项目,检查你的 Map 如果它有一个特定的键或没有,如果没有,把新键和 emptyList 来收集你的数据。检查下面的代码。
Map<String, List<Double>> data = new HashMap<>();
persons.forEach(
p->{
String key = p.getName();
if(!data.contains(key)){
data.put(key, new ArrayList());
}
data.get(key).add(p.getSalary);
}
);
考虑到 Person
class 有三个字段 name(String), age(int), salary(double)。
我想创建一个以名称为键,以薪水为值的映射(而不是 Person
对象本身),如果键不是唯一的,则使用 linkedList 来保存所有值重复键。
我指的是下面给出的link中给出的解决方案: 在 Java 8 中惯用地从 Stream 创建多值 Map 但仍然不清楚如何创建以 Salary 作为值的 hashmap。
我可以用 forEach() 创建 map<String, List<Double>>
。代码如下:
List<Person> persons= new ArrayList<>();
persons.add(p1);
persons.add(p2);
persons.add(p3);
persons.add(p4);
Map<String, List<Double>> personsByName = new HashMap<>();
persons.forEach(person ->
personsByName.computeIfAbsent(person.getName(), key -> new LinkedList<>())
.add(person.getSalary())
);
但我正在尝试使用 "groupingBy & collect" 创建地图。
如果我们想要 Person
对象本身作为值,那么代码如下:
Map<String, List<Person>> personsByNameGroupingBy = persons.stream()
.collect(Collectors.groupingBy(Person::getName, Collectors.toList()));
但我想创建一个以薪水为值的地图,如下所示:
Map<String, List<Double>>
如何实现这个场景?
您可以使用 Collectors.mapping
将 Person
个实例映射到相应的薪水:
Map<String, List<Double>> salariesByNameGroupingBy =
persons.stream()
.collect(Collectors.groupingBy(Person::getName,
Collectors.mapping(Person::getSalary,
Collectors.toList())));
创建一个 Map 然后做一个 forEach,对于每个项目,检查你的 Map 如果它有一个特定的键或没有,如果没有,把新键和 emptyList 来收集你的数据。检查下面的代码。
Map<String, List<Double>> data = new HashMap<>();
persons.forEach(
p->{
String key = p.getName();
if(!data.contains(key)){
data.put(key, new ArrayList());
}
data.get(key).add(p.getSalary);
}
);