优化Java代码以实现Map computeIfPresent

时间:2019-09-01 14:18:50

标签: java

我有以下方法,在该方法中,我从实体中提取值,然后在map中将其设置为该map的值,但是我的意思是,对于每个键,我都明确设置了该值,因此如果密钥增长意味着方法代码也将增长,我能否基于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 个答案:

答案 0 :(得分:1)

如果我正确理解,您想要做的就是遍历该对象的所有成员,获取它们的值,然后根据其名称将它们设置为地图。如果是这样,那么您要寻找的就是反射。

每个对象都可以为您提供其字段或方法的数组(甚至是私有的!),然后您可以使用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行使用实例。 这段代码并不完整,但这只是一个开始,它也可以适用于任何对象。

答案 1 :(得分:1)

  

但是我的意思是我为每个键都明确设置了值,所以   如果键数增加,则方法代码也将增加

您需要使用与DTO不同的值来填充Map,所以您没有其他选择。
该方法之所以长,是因为在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 

但是没有真正的优势。

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

答案 2 :(得分:0)

我不知道我是否正确理解了,但是如果我能正确理解,那意味着您所需要的只是为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());
    }