我如何将下面的代码重构为1种通用方法?
(背景信息,它用于从与GSON库一起使用的Json字符串中获取值)
ArrayList<Map<Object, Object>> theme = new ArrayList<Map<Object, Object>>();
for (int i = 0; i < obj.getThemeList().size(); i = i + 1) {
if(Boolean.parseBoolean(obj.getThemeList().get(i).getChecked())){
Map<Object,Object> map = new HashMap<Object,Object>();
map.put("id", obj.getThemeList().get(i).getId());
map.put("name", obj.getThemeList().get(i).getName());
theme.add(map);
}
}
ArrayList<Map<Object, Object>> tag = new ArrayList<Map<Object, Object>>();
for (int i = 0; i < obj.getTagList().size(); i = i + 1) {
if(Boolean.parseBoolean(obj.getTagList().get(i).getChecked())){
Map<Object,Object> map = new HashMap<Object,Object>();
map.put("id", obj.getTagList().get(i).getId());
map.put("name", obj.getTagList().get(i).getName());
tag.add(map);
}
}
答案 0 :(得分:4)
基本上,只需将其设为接受getThemeList()
或getTagList()
的单一方法,不是吗?看起来这是他们之间的唯一区别......
答案 1 :(得分:3)
我认为你的意思是“我怎么能重构这个以重用代码”,因为泛型不像重构那样适用于此。
首先,阅读foreach syntax - 你的for循环非常难看。
你没有给予太多帮助,但试试这个:
public interface HasIdNameAndChecked {
String getChecked();
String getId();
String getName();
}
public static List<Map<String, String>> extractList(List<? extends HasIdNameAndChecked> items) {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (HasIdNameAndChecked item : items) {
if (Boolean.parseBoolean(item.getChecked())){
Map<String, String> map = new HashMap<String, String>();
map.put("id", item.getId());
map.put("name", item.getName());
list.add(map);
}
}
return list;
}
然后让您的Theme
和Tag
类实现HasIdNameAndChecked
,并将其称为:
List<Map<String, String>> list1 = extractThemeList(obj.getThemeList());
List<Map<String, String>> list2 = extractThemeList(obj.getTagList());
免责声明:我在没有IDE的情况下输入了这个内容,因此可能存在一些拼写错误。
答案 2 :(得分:0)
好吧,让我们按照以下顺序进行:
确定变化的内容。 themeList和tagList。
识别常见属性和行为。 getChecked(),getId(),getName()。
对不同的内容应用泛化。为不同的内容定义一个通用接口:抽象类,接口,行为等。
将您的解决方案更新为通用解决方案。