将列表映射到映射中的 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
,这可以用另一个流执行。
只要我们不知道要映射的对象的结构,就得自己加上注释行了。
我有这样的合集: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
,这可以用另一个流执行。
只要我们不知道要映射的对象的结构,就得自己加上注释行了。