有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将List<Person>转换为Map<String,List<Double>>而不是Map<String,List<Person>>?

考虑到Person类有三个字段name(字符串)、age(int)、salary(double)

我想创建一个映射,名称为key,值为salary(而不是Person对象本身),如果key不是唯一的,那么使用linkedList保存所有重复key的值

我指的是下面链接中给出的解决方案: Idiomatically creating a multi-value Map from a Stream in Java 8 但仍不清楚如何创建以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>> 

如何实现这种情况


共 (1) 个答案

  1. # 1 楼答案

    创建一个映射,然后对每个项目执行一个forEach,检查你的映射是否有特定的键,如果没有,则放置新键并清空列表以收集数据。检查下面的代码

    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);
        }
    );