我有两种类似的方法.其中一个打印出来的东西,其中一个可以节省一些东西.正如您所看到的,有很多重复的代码.我应该如何重构它并删除这个重复?
public static void printSomething(List<String> list) {
for (String item : list) {
if (item.contains("aaa")) {
System.out.println("aaa" + item);
}
if (item.contains("bbb")) {
System.out.println("bbb" + item);
} else {
System.out.println(item);
}
}
}
public static Map<String, String> getSomething(List<String> list) {
Map<String, String> map = new HashMap<String, String>();
for (String item : list) {
if (item.contains("aaa")) {
map.put("aaa", item);
}
if (item.contains("bbb")) {
map.put("bbb", item);
} else {
//do nothing
}
}
return map;
}
Run Code Online (Sandbox Code Playgroud)
更新:
当方法不完全相似时,代码已更新以解决问题
假设printlnof "aaa"和of的顺序"bbb"无关紧要,可以替换printSomethingwith 的实现
public static void printSomething(List<String> list) {
Map<String, String> map = getSomething(list);
for(Map.Entry<String, String> entry : map) {
System.out.println(entry.getKey() + entry.getValue());
}
}
Run Code Online (Sandbox Code Playgroud)
具有方法action(T t) 的通用接口操作可以减少代码。
public interface Action<E> {
void action(E e);
}
Run Code Online (Sandbox Code Playgroud)
例子:
public static void forEach(List<String> list, Action <String> action) {
for(String s : list){
action.action(s);
}
Run Code Online (Sandbox Code Playgroud)
现在您只需要 2 个不同的 Action 实现。
如果您不想创建类,可以使用匿名类型。
如果您了解 C#,这与 lambda 类似。
编辑:
使用匿名类型:
public static Map<String, String> getSomething(List<String> list) {
final Map<String, String> map = new HashMap<String, String>();
forEach(list, new Action<String>() {
@Override
public void action(String e) {
if (e.contains("aaa")) {
map.put("aaa", e);
}
if (e.contains("bbb")) {
map.put("bbb", e);
} else {
// do nothing
}
}
});
return map;
}
Run Code Online (Sandbox Code Playgroud)
创建类:
public static Map<String, String> getSomething2(List<String> list) {
final Map<String, String> map = new HashMap<String, String>();
forEach(list, new ListToMapAction(map));
return map;
}
public class ListToMapAction implements Action<String> {
Map<String, String> map;
public ListToMapAction(Map<String, String> map) {
this.map = map;
}
@Override
public void action(String e) {
if (e.contains("aaa")) {
map.put("aaa", e);
}
if (e.contains("bbb")) {
map.put("bbb", e);
} else {
// do nothing
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |