mapstruct преобразовать список в карту

Я очень новичок в mapstruct. Я пытаюсь преобразовать список в карту, я много искал в Интернете, у меня есть некоторые решения, подобные тем, которые еще не реализованы в mapstruct. Я буду рад, если кто-то сможет предоставить альтернативное решение. Все, что я ищу, чтобы преобразовать отображение, как показано ниже:

@Mapping
Map<String, Object> toMap(List<MyObj>)

@Mapping
    List<MyObj> toList(Map<String, Object>)

где MyObj, как показано ниже:

class MyObj {
  String key; //map key
  String value; //map value
  String field1;
}

В приведенном выше примере используйте только поля ключа и значения из класса MyObj. Я нашел одно решение, но ниже приведено преобразование некоторого объекта в MAP, но с использованием Джексона ниже:

@Mapper
public interface ModelMapper {

  ObjectMapper OBJECT_MAPPER = new ObjectMapper();

  default HashMap<String, Object> toMap(Object filter) {
    TypeFactory typeFactory = OBJECT_MAPPER.getTypeFactory();
    return OBJECT_MAPPER.convertValue(filter, typeFactory.constructMapType(Map.class, String.class, Object.class));
  }
}

есть ли возможность реализовать с помощью mapstruct?


person john    schedule 08.11.2019    source источник
comment
Не знаю о mapstruct, но с помощью java stream API вы также можете легко изменить структуру данных. stackoverflow.com/questions/20363719/java- 8-listv-to-mapk-v   -  person www.hybriscx.com    schedule 08.11.2019
comment
На самом деле мне нужно решение, использующее только mapstruct!   -  person john    schedule 08.11.2019
comment
я нашел это с помощью быстрого поиска github.com/mapstruct/mapstruct/issues/850 похоже, вам нужно создать функцию toMap в компоненте вместо картографа.   -  person www.hybriscx.com    schedule 08.11.2019


Ответы (1)


Структура карты не имеет неявного преобразования для желаемого списка в карту. У вас может быть собственный метод сопоставления следующим образом:

@Mapper
public interface FooMapper {


    default Map<String, Foo> convertFooListToMap(List<Foo> foos) {
      // custom logic using streams or however you like.
    }
}

Другие варианты включают пользовательские реализации картографа, которые вы пишете и ссылаетесь на что-то вроде @Mapper(uses=CustomMapper.class)

person Karthik R    schedule 08.11.2019
comment
Или, альтернативно, просто добавьте вышеперечисленное в маппер, который вы пишете. Идея состоит в том, что MapStruct убирает большую часть отображения, но всегда будут оставаться какие-то вещи, требующие написания кода вручную. MapStruct распознает метод (ищет тот, который может преобразовать List<Foo> в Map<String,Foo. - person Sjaak; 10.11.2019
comment
@Sjaak, не могли бы вы помочь мне в этом: stackoverflow.com/questions/58842694/ - person john; 13.11.2019
comment
@karthik: не могли бы вы помочь мне в этом: stackoverflow.com/questions/58842694/ - person john; 13.11.2019