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

How to rewrite Modelmapper Converter as Lambda Expression (java 1.8)?

我使用 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 重写匿名内部 class :

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

但是当我测试 (JUnit) 转换器时 return null 当它是 lambda 表达式时。

如何将这个匿名内部 class 重写为 lambda 表达式,从而真正转换?

lambda 本身是有效的,应该可以工作。限制是 Converter 必须是功能接口,而不是 class.

The target type of this expression must be a functional interface

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

那么 lambda 看起来是一样的,应该可以工作:

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

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

解决方法如下:

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