我有一个具有名称,电子邮件和地址的Contact类。我将它们存储在ArrayList
中。现在,我有三种不同的方法,可让用户使用姓名,电子邮件或地址搜索联系人。除比较语句外,每个函数与其他函数完全相同,一个具有name.equals(contact.getName())
,另一个具有email.equals(contact.getEmail())
,最后一个具有address.equals(contact.getAddress())
。我知道DRY原理,可以在这里应用,有没有办法避免在这种情况下重复我自己?
public void searchName(String name)
{
for(int i = 0; i < contacts.size(); i++)
{
Contact contact = contacts.get(i);
if(name.equals(contact.getName())
{
printContactInfo(contact);
}
}
}
其他两种方法完全相同,但是它们使用电子邮件或地址而不是使用名称。
答案 0 :(得分:2)
You could pass this as a Function. Java 8's syntax enhancements lend themselves nicely to such usecases:
public void searchName(String name) {
search(name, Contact::getName);
}
public void searchEmail(String email) {
search(email, Contact::getEmail);
}
public void searchAddress(String address) {
search(address, Contact::getAddress);
}
private void search(String s, Function<Contact, String> f) {
contacts.stream().filter(c -> f.apply(c).equals(s)).forEach(this::printContactInfo);
}
答案 1 :(得分:1)
定义您的三种搜索方法,它们全部委托给“主”搜索方法。实施此操作所需的枚举以及搜索背后的实际逻辑是读者的一项练习。
public void searchName(String name) {
search(SearchType.NAME, name);
}
public void searchEmail(String email) {
search(SearchType.EMAIL, email);
}
public void searchAddress(String address) {
search(SearchType.ADDRESS, address);
}
private void search(SearchType type, String value) {
switch(type) {
case NAME:
break;
case EMAIL:
break;
case ADDRESS:
break;
}
}