将列表映射到映射中的 DTO - java

Map a List to DTO inside map - java

我有这样的合集:Map<Integer, List<MyObject>> collection 我想将 MyObject 的整个列表映射到 MyObjectDTO 和 return 整个映射与映射列表。

所以 return 将是: Map<Integer, List<MyObjectDto>> collectionWithDtos

最简单快捷的方法是什么?我已经用流检查了几种方法,但其中 none 产生了我预期的结果。 谢谢

使用 for 循环和流:

private Map<Integer, List<MyObjectDto>> mapNestedListToDto(Map<Integer, List<MyObject>> collection) {
    Map<Integer, List<Dto>> collectionWithDtos = new HashMap<>();
    for (Integer i : collection.keySet()) {
      List<Dto> dtos = collection.get(i).stream().map(myObject -> mappingFunction(myObject)).collect(Collectors.toList());
      mapped.put(i, dtos);
    }

    return collectionWithDtos;
}

其中 mappingFunction() 是实际将 MyObject 实例转换为 MyObjectDTO 实例的方法。

您可以创建一个新的 HashMap,在其中放置具有新值的旧键(值将是基于原始对象创建的 Dto)

class Person {
String name ;
public Person(String s) {
    this.name=s;
}
@Override
public String toString() {
    // TODO Auto-generated method stub
    return name;
}
}

class PersonDto {
String name;
public PersonDto(Person p) {
    this.name=p.name+"Dto";
}
@Override
public String toString() {
    // TODO Auto-generated method stub
    return name;
}
}

public class Main {
public static void main(String[] args) {
// your initial HashMap 
    Map<Integer, List<Person>> map = new HashMap<>();
    Person x =new Person("X");
    Person y =new Person("Y");
    List<Person> lst1 = new ArrayList<>();
    lst1.add(x);
    List<Person> lst2 = new ArrayList<>();
    lst2.add(y);
    
    map.put(1, lst1);
    map.put(2, lst2);
    // create a new HashMap<Integer, List<MyObjectDto>> 
    Map<Integer, List<PersonDto>> mapDto = new HashMap<>();
    // Simply use forEach 
    // in the next line instead of "new PersonDto(e)" you will put your mapping method 
    map.forEach((k,v)->{
        mapDto.put(k, v.stream().map(e-> new PersonDto(e)).collect(Collectors.toList()));
        
    });
    
    System.out.println(map);
    System.out.println(mapDto);
    
    }
}

输出:

{1=[X], 2=[Y]}

{1=[XDto], 2=[YDto]}

这是通过以下简单调用实现的方法:

Map<Integer, List<MyObjectDto>> mappedCollection = collection.entrySet().stream()
        .collect(Collectors.toMap(
                Map.Entry::getKey, 
                e -> e.getValue().stream()
                        .map(myObject -> new MyObjectDto())  // perform the mapping here
                        .collect(Collectors.toList())));

基本上,您想将其收集到具有相同键的相同结构的映射中。流式传输条目集 Set<Map.Entry<Integer, List<MyObject>>> 并使用 Collectors.toMap(Function, Function) 将其映射到新映射中,其中:

  • 密钥是同一个密钥:entry -> entry.getKey()
  • 值是相同的值 (List),除了所有 MyObject 对象都映射到 MyObjectDto,这可以用另一个流执行。

只要我们不知道要映射的对象的结构,就得自己加上注释行了。