是否可以使用 MapStruct 从 HashMap 转换为 List
Is it possible to convert from HashMap to List using MapStruct
我知道有一个类似的问题(参见 question),但我在那里找不到有用的答案。假设我有以下 类:
class QuestionType {
private String type;
}
class Profile {
private String name;
private int id;
}
class ProfileResponse {
private String name;
private int id;
private String type;
}
如何使用 MapStruct (1.3.1)
将 HashMap<QuestionType, Profile>
转换为 List<ProfileResponse>
@Mapper(componentModel = "spring")
public interface ProfileResponseMapper {
List<ProfileResponse> toProfileResponse(Map<QuestionType, Profile> profiles);
}
我更愿意遵循 KISS 原则:
通过地图迭代 bi-consumer,创建您的 ProfileResponse 对象并将它们放入列表中。
map.forEach (key, val ->
{
ProfileRespone respone = new ProfileResponse(key.type, val.name, val.id);
list.add(response);
}
MapStruct 没有将 Map
映射到 List
的隐式转换机制。但是,您可以采取一些技巧将 Map
理解为 Entry
的集合,并将每个条目映射到列表项中:
@Mapper(componentModel = "spring")
public interface ProfileResponseMapper {
@Mapping(target = "type", source = "key.type")
@Mapping(target = "name", source = "value.name")
@Mapping(target = "id", source = "value.id")
ProfileResponse map(Map.Entry<QuestionType, Profile> profile);
default List<ProfileResponse> toProfileResponse(Map<QuestionType, Profile> map) {
return map.entrySet()
.stream()
.map(this::map)
.collect(Collectors.toList());
}
}
ProfileResponseMapper mapper = ... // ProfileResponseMapper.INSTANCE or @Autowired
Map<QuestionType, Profile> map = ... // input Map
List<ProfileResponse> profileResponseList = mapper.toProfileResponse(map);
该代码利用了Java 8 default
方法和Stream API 的优点,否则使用abstract class
和for-each 循环。
我知道有一个类似的问题(参见 question),但我在那里找不到有用的答案。假设我有以下 类:
class QuestionType {
private String type;
}
class Profile {
private String name;
private int id;
}
class ProfileResponse {
private String name;
private int id;
private String type;
}
如何使用 MapStruct (1.3.1)
将HashMap<QuestionType, Profile>
转换为 List<ProfileResponse>
@Mapper(componentModel = "spring")
public interface ProfileResponseMapper {
List<ProfileResponse> toProfileResponse(Map<QuestionType, Profile> profiles);
}
我更愿意遵循 KISS 原则: 通过地图迭代 bi-consumer,创建您的 ProfileResponse 对象并将它们放入列表中。
map.forEach (key, val ->
{
ProfileRespone respone = new ProfileResponse(key.type, val.name, val.id);
list.add(response);
}
MapStruct 没有将 Map
映射到 List
的隐式转换机制。但是,您可以采取一些技巧将 Map
理解为 Entry
的集合,并将每个条目映射到列表项中:
@Mapper(componentModel = "spring")
public interface ProfileResponseMapper {
@Mapping(target = "type", source = "key.type")
@Mapping(target = "name", source = "value.name")
@Mapping(target = "id", source = "value.id")
ProfileResponse map(Map.Entry<QuestionType, Profile> profile);
default List<ProfileResponse> toProfileResponse(Map<QuestionType, Profile> map) {
return map.entrySet()
.stream()
.map(this::map)
.collect(Collectors.toList());
}
}
ProfileResponseMapper mapper = ... // ProfileResponseMapper.INSTANCE or @Autowired
Map<QuestionType, Profile> map = ... // input Map
List<ProfileResponse> profileResponseList = mapper.toProfileResponse(map);
该代码利用了Java 8 default
方法和Stream API 的优点,否则使用abstract class
和for-each 循环。