如何将 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));
我使用 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));