如何从同一方法中查看对象的不同参数?

时间:2018-09-18 19:21:06

标签: java oop

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

其他两种方法完全相同,但是它们使用电子邮件或地址而不是使用名称。

2 个答案:

答案 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;
    }
}