是否可以使用 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 循环。