我有一个具有名称,电子邮件和地址的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);
}
}
}
其他两种方法完全相同,但是它们使用电子邮件或地址而不是使用名称。
最佳答案
您可以将此作为函数传递。 Java 8的语法增强非常适合以下用例:
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);
}