我正在尝试使用以下代码将一个对象映射到另一个对象(Record
-> ParsedAddress
):
public class ParsedAddress extends Address {
private static final Map<Field, Consumer<String>> MAPPINGS = new EnumMap<>(Field.class);
public ParsedAddress(final Record record, final List<Field> order) {
super();
this.mapFields(record, order);
}
private void mapFields(final Record record, final List<Field> order) {
this.setupMapping();
for (final Map.Entry<Field, Consumer<String>> mapping : MAPPINGS.entrySet()) {
final Field field = mapping.getKey();
final String value = record.getField(field, order);
final Consumer<String> setter = mapping.getValue();
setter.accept(value);
}
}
private void setupMapping() {
if (!MAPPINGS.isEmpty()) return;
MAPPINGS.put(SALUTATION, this::setSalutation);
MAPPINGS.put(FIRST_NAME, this::setFirstName);
MAPPINGS.put(SURNAME, this::setSurname);
// etc...
}
}
([Address
是包含所有映射字段的数据对象。)
我这样称呼构造函数:
records.stream()
.map(record -> new ParsedAddress(record, ORDER))
.collect(toUnmodifiableList());
但是只有第一个“记录”被映射。结果集合包含一个具有所有数据的ParsedAddress
(因此逻辑工作正常)和具有ParsedAddress
字段的null
。
我调试了它,并设法将问题缩小到setter.accept(value)
行。无论在流还是循环中调用构造函数,其工作原理都完全相同。
关于对象初始化吗?但是,为什么一个对象恰好成功映射,而其余对象却不成功?
编辑
:Record
类仅包含要映射的数据。这是getField
方法:public String getField(final Field field, final List<Field> order) {
final int index = order.indexOf(field);
return index == -1 ? null : this.data.get(index);
}
我正在尝试使用以下代码将一个对象映射到另一个对象(记录-> ParsedAddress):公共类ParsedAddress扩展了地址{私有静态最终Map
这里的问题是,MAPPINGS
映射是延迟加载的静态映射,而this
关键字不是。
这将导致地图被完全填充一次,但引用了到达该地图的第一个对象(延迟加载地图的对象)的公共设置器。