如何将Modelmapper转换器重写为Lambda表达式(java 1.8)?

时间:2018-08-22 07:58:21

标签: java spring lambda java-8 modelmapper

我使用 ModelMapper 2.1.0 ,并且有一个名为 Converter

的接口

我正在像这样使用Converter(modelmapper):

import org.modelmapper.Converter;

public class MyClass {
    private ModelMaper myMapper = new ModelMapper();      
    Converter<Instant, java.util.Date> myDateConverter;

    @Before 
    public void setup() {
        myDateConverter = new Converter<Instant, java.util.Date>() {

        @Override
        public java.util.Date convert(MappingContext<Instant, java.util.Date> mappingContext) {
                return java.util.Date.from(mappingContext.getSource());
            }
       }
    }

    @Test
    public void fromDto() {
        myMapper.addConverter(myDateConverter);
        ....
        assertThat(domain.getDate()).isEqualTo(dto.getDate())
    }
}

现在,我只想像这样用lambda重写匿名内部类:

myDateConverter = mappingContext -> java.util.Date.from(mappingContext.getSource());

但是当我测试(JUnit)时,转换器是lambda表达式时返回null

如何将该匿名内部类重写为实际上可以转换的lambda表达式?

2 个答案:

答案 0 :(得分:2)

lambda本身有效并且应该起作用。限制是Converter必须是功能接口,而不是类。

  

此表达式的目标类型必须是功能接口

@FunctionalInterface
public interface Converter<T1, T2> {
    public Date convert(MappingContext<Instant, Date> mappingContext);
}

然后,lambda看起来一样并且应该工作:

myDateConverter = mappingContext -> java.util.Date.from(mappingContext.getSource());

答案 1 :(得分:2)

我认为这个问题是ModelMapper无法正确地通过lambda表达式解析泛型。

这是解决方法:

modelMapper.typeMap(Source.class, Destination.class)
  .setConverter(ctx -> new Destination(ctx.getSource));