我有一个具有名称,电子邮件和地址的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);
}

10-07 16:33
查看更多