首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Map computeIfPresent方法的java代码优化

Map computeIfPresent方法的java代码优化
EN

Stack Overflow用户
提问于 2019-09-01 22:18:50
回答 3查看 94关注 0票数 1

我有下面的方法,我从实体中提取值,然后在映射中将其设置为该映射的值,但我的观点是,对于每个键,我都显式地设置了值,因此,如果键的数量增加,方法代码也会增加,我能否基于approach Map.computeIfPresent创建一个通用方法,请告诉我如何实现这两个目标

代码语言:javascript
复制
   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());
    }

在下面的方法中,我在想一些事情

代码语言:javascript
复制
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));
        }
    }
EN

回答 3

Stack Overflow用户

发布于 2019-09-01 22:39:55

如果我理解正确的话,您要做的是迭代对象的所有成员,获取它们的值,并根据它们的名称将它们设置为一个映射。如果是这样,那么你要寻找的就是反射。

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

代码语言:javascript
复制
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行的实例。这段代码并不完整,但它是一个开始,它也可以适用于任何对象。

票数 1
EN

Stack Overflow用户

发布于 2019-09-01 22:42:21

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

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

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

您可以使用如下所示的函数编写代码:

代码语言:javascript
复制
static void setValueInMap(Map<String, Object> map, String key, Supplier<Object> mapper) {
    map.put(key, mapper.get());
}

并使用它:

代码语言:javascript
复制
Map<String, Object> map = ...;
AbcLoginDTO dto = ...;
setIfPresent(map, "keyUserName", dto::getUserName);
// and so for 

但没有真正的优势。

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

票数 1
EN

Stack Overflow用户

发布于 2019-09-01 22:35:56

我不知道我是否理解正确,但如果我理解正确了,这意味着你所需要的就是手动为你的AbcLoginDTO class的方法设置不同的键。如果是这样的话,这可以很容易地完成,让我们考虑到你的abcLoginDTO.getClientId()对于每个AbcLoginDTO对象总是不同的:

代码语言:javascript
复制
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());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57746751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档