![](/img/trans.png)
[英]How can I group Stream<Person> into Stream<List<Person>>, not into Map<String, <List<Person>>?
[英]How to convert List<Person> to Map<String, List<Double>> instead of Map<String, List<Person>>?
考虑Person
类有三个字段名称(String),age(int),salary(double)。
我想创建一个名称为key,值为salary(而不是Person
对象本身)的映射,如果key不唯一,则使用linkedList保存所有重复键的值。
我指的是下面给出的链接中给出的解决方案: 在Java 8中从流中以惯用方式创建多值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是否有特定的密钥,如果没有,则输入new key和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);
}
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.