gpt4 book ai didi

java - 通过 getter 和 setter 更新 pojo 的通用方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:39 27 4
gpt4 key购买 nike

假设我有一个带有不同类型的 getter 和 setter 的 POJO。我想编写一些通用算法,用于基于仅通过 lambda 定义 getter 和 setter 将数据从一个更新到另一个。我正在尝试以这种方式创建它

private static final Map<Function<Entity, Object>, BiConsumer<Entity, Object>> ACCESSORS = new HashMap
<Function<Entity, Object>, BiConsumer<Entity, Object>>() {{
put(Entity::getAreaCode, Entity::setAreaCode);
}});

然后我遍历所有将目标实体应用于它们的条目,如果 getter 的结果不为空,那么我想为其他实体应用相应的 setter。

但它不会工作,因为 Object 不能转换为 String。我想将它用于不同的类型,不仅是字符串,还有整数等......

是否可以通过一些简单的方法解决而无需创建特殊转换器并将其与每个条目相关联?

最佳答案

使用类似的东西

private static final List<BiConsumer<Entity,Entity>> ACCESSORS =
Collections.unmodifiableList(Array.asList(
(src,dst) -> dst.setAreaCode(src.getAreaCode()),
(src,dst) -> dst.setOtherProperty(src.getOtherProperty())
/* etc */
));

然后,您可以遍历列表并将每个操作应用于两个实体,例如

static final void copyAll(Entity src, Entity dst) {
ACCESSORS.forEach(op -> op.accept(src, dst));
}

关键点是实际的属性值类型在每个BiConsumer 中处理。但不再是通用签名的一部分,因此不需要为 ACCESSORS 声明.它甚至更高效,因为它可以处理原始数据类型而无需装箱开销。

Map无论如何都不是适合此任务的数据结构,至于这些函数,无法执行有意义的查找,因此这是一种仅用于迭代的数据结构。

您可以将“仅在非空时复制”逻辑与通用辅助方法集成:

private static final List<BiConsumer<Entity,Entity>> ACCESSORS =
Collections.unmodifiableList(Arrays.asList(
copyWhenNonNull(Entity::getAreaCode, Entity::setAreaCode),
copyWhenNonNull(Entity::getOtherProperty, Entity::setOtherProperty)
/* etc */
));
private static <E,V> BiConsumer<E,E> copyWhenNonNull(
Function<? super E, ? extends V> getter, BiConsumer<? super E, ? super V> setter) {
return (src,dst) -> {
V value = getter.apply(src);
if(value != null) setter.accept(dst, value);
};
}

copyAll方法不变。这甚至允许混合无条件复制永远不会是 null 的属性。带条件复制。

关于java - 通过 getter 和 setter 更新 pojo 的通用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54294416/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com