推广java中的4种方法

时间:2018-04-02 10:33:27

标签: java generics methods

假设我们有以下方法:

private boolean elephantExists(String name){
    for (Elephant e : elephantList) {
        if (e.getElephantName().equals(name)) {
            return true;
        }
    }
    return false;
}

private boolean elephantIDExists(String elephantID){
    for (Elephant e : elephantList) {
        if (e.getElephantID().equals(elephantID)) {
            return true;
        }
    }
    return false;
}

private boolean tigerIDExists(String tigerID){
    for (Tiger t : tigerList) {
        if (t.getTigerID().equals(tigerID)) {
            return true;
        }
    }
    return false;
}

private boolean dogIDExists(String dogID){
    for (Dog d : dogList) {
        if (d.getDogID().equals(dogID)) {
            return true;
        }
    }
    return false;
}

我们如何将所有这些方法概括为一种方法?

我想过做这样的事情:

private boolean ifExists(String s, ArrayList<Object> arrList) {
    for (Object o : arrList) {
        if (something) {
            return true;
        } 
    }
    return false;
}

但是我不确定if语句是什么。我很难概括这一点,并希望得到帮助:)

3 个答案:

答案 0 :(得分:3)

最直接的方法是定义像b这样的界面:

IdAware

然后让所有动物类实现此接口。这需要将public interface IdAware { public String getId(); } 重命名为getTigerId(),但这只是一个小小的牺牲。

然后您可以使用此方法搜索动物列表。类似的东西:

getId()

或者如果由于某种原因你不想(或不能)拥有一个公共接口,你可以另外传递一个提取id的lambda。

private <T extends IdAware> boolean ifExists(String id, Collection<T> animals) {
    return animals.stream().anyMatch(animal -> id.equals(animal.getId()));
}

然后将其称为private <T> boolean ifExists(String id, Collection<T> animals, Function<T, String> getId) { return animals.stream().map(getId).anyMatch(animalId -> id.equals(animalId)); }

答案 1 :(得分:0)

我会像这样创建一个Animal基类:

abstract class Animal {
    abstract String getId();
    abstract String getName();
}

然后让所有其他人扩展它:

class Elephant extends Animal {

    @Override
    String getId() {
        // do logic
    }

    @Override
    String getName() {
          // do logic
    }
}

class Tiger extends Animal{

    @Override
    String getId() {
         // do logic
    }

    @Override
    String getName() {
          // do logic
    }
}


class Dog extends Animal {

    @Override
    String getId() {
        // do logic
    }

    @Override
    String getName() {
          // do logic
    }
}

现在您可以将Animal类型的任何对象添加到ArrayList<Animal>中,并将其与条件一起传递给ifExists方法。

private static boolean ifExists(Predicate<Animal> predicate, List<Animal> arrList) {
        for (Animal animal : arrList) {
            if (predicate.test(animal)) {
                return true;
            }
        }
        return false;
}

现在你可以这样做:

ifExists(tiger -> tiger.getId().equals("007464"), arrList);
ifExists(elephant -> elephant.getId().equals("00D37464"), arrList);
ifExists(elephant -> elephant.getName().equals("Bo-Tat"), arrList);
ifExists(dog -> dog.getId().equals("008483"), arrList);
....
....
....

答案 2 :(得分:0)

如果您不熟悉Java 8,并且您正在寻找一个简单的答案。这是代码:

class AnimalId{
private String id;
public String getId(){ return this.id; }
}

class Elephant extends AnimalId{
//Other variables and function
}
class Tiger extends AnimalId{
//Other variables and function
}
class Dog extends AnimalId{
//Other variables and function
}

这涵盖了您需要的概括。现在来看你的实际代码,它将是这样的:

private boolean ifExists(String s, ArrayList<AnimalId> arrList) {
    for (AnimalId o : arrList) {
        if (o.getId.equals(s)) {
            return true;
        } 
    }
    return false;
}