为了账号安全,请及时绑定邮箱和手机立即绑定

优化MapcomputeIfPresent方法的java代码

优化MapcomputeIfPresent方法的java代码

慕神8447489 2023-06-28 16:30:29
我有下面的方法,其中我从实体中提取值,然后将其设置在映射中作为该映射的值,但我的观点是,对于每个键,我显式设置值,因此如果键的数量增加方法代码也会增长,我可以基于方法Map.computeIfPresent制作一个通用方法吗,请告知我如何实现这两件事   private void setMap(AbcLoginDTO abcLoginDTO, Map<String, Object> getMap) {        getMap.put("XXNAME", abcLoginDTO.getUsername());        getMap.put("XX_ID", abcLoginDTO.getClientId());        getMap.put("RR_ID", abcLoginDTO.getUserId());        getMap.put("QQ_TIME", abcuserLoginDTO.getLocktime());    }我在想类似下面的方法static <E> void setIfPresent(Map<String, Object> map, String key, Consumer<E> setter, Function<Object, E> mapper) {        Object value = map.get(key);        if (value != null) {            setter.accept(mapper.apply(value));        }    }
查看完整描述

3 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

但我的观点是,对于每个键,我都会显式设置值,因此如果键的数量增加,方法代码也会增加


您需要Map使用 DTO 中的不同值填充 ,因此您没有其他选择。

该方法很长,因为您在 Map 中添加的键和从 DTO 检索的值之间没有映射。


您可以使用以下函数编写代码:


static void setValueInMap(Map<String, Object> map, String key, Supplier<Object> mapper) {

    map.put(key, mapper.get());

}

并使用它:


Map<String, Object> map = ...;

AbcLoginDTO dto = ...;

setIfPresent(map, "keyUserName", dto::getUserName);

// and so for 

但没有真正的优势。


您的第二个片段与第一个片段完全没有关系。


查看完整回答
反对 回复 2023-06-28
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如果我理解正确,您想要做的是迭代对象的所有成员,获取它们的值,然后根据它们的名称将它们设置为映射。如果是这样,那么您正在寻找的就是所谓的“反射”。


每个对象都可以为您提供其字段或方法(甚至是私有的!)的数组,然后您可以使用 Field / Method 对象来操作它们。


Field[] members = AbcLoginDTO.class.getDeclaredFields();

Map<String, Object> values = new HashMap<>();


for(Field member : members) {

    member.setAccessible(true);

    values.put(member.getName(), member.get(abcLoginDTO));

}

您最终得到的是 AbcLoginDTO 实例的“地图表示”。从这里你可以用它做你想做的事...请注意,我在第 1 行中“检查”类本身,然后使用第 6 行中的实例。这段代码并不完整,但它是一个开始,这可以也适用于任何对象。


查看完整回答
反对 回复 2023-06-28
?
慕容森

TA贡献1853条经验 获得超18个赞

我不知道我是否理解正确,但如果我这样做了,那就意味着您所需要的只是一种为您的方法手动设置不同键的方法AbcLoginDTO class 如果是这样,那么这可以轻松完成,让我们考虑一下您的方法abcLoginDTO.getClientId()总是不同的每个AbcLoginDTO对象:


private void setMap(AbcLoginDTO abcLoginDTO, Map<String, Object> getMap) {

        getMap.put(Integer.toString(abcLoginDTO.getClientId())+"_NAME", abcLoginDTO.getUsername());

        getMap.put(Integer.toString(abcLoginDTO.getClientId())+"_ID", abcLoginDTO.getClientId());

        getMap.put(Integer.toString(abcLoginDTO.getClientId())+"_ID", abcLoginDTO.getUserId());

        getMap.put(Integer.toString(abcLoginDTO.getClientId())+"_TIME", abcuserLoginDTO.getLocktime());

    }


查看完整回答
反对 回复 2023-06-28
  • 3 回答
  • 0 关注
  • 138 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信