3 回答

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
但沒有真正的優勢。
您的第二個片段與第一個片段完全沒有關系。

TA貢獻2041條經驗 獲得超4個贊
如果我理解正確,您想要做的是迭代對象的所有成員,獲取它們的值,然后根據它們的名稱將它們設置為映射。如果是這樣,那么您正在尋找的就是所謂的“反射”。
每個對象都可以為您提供其字段或方法(甚至是私有的?。┑臄到M,然后您可以使用 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 行中的實例。這段代碼并不完整,但它是一個開始,這可以也適用于任何對象。

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());
}
添加回答
舉報