Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中推广4种方法_Java_Generics_Methods - Fatal编程技术网

在java中推广4种方法

在java中推广4种方法,java,generics,methods,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 elepha

假设我们有以下方法:

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;
}
private boolean ifExists(字符串s,ArrayList arrList){
for(对象o:arrList){
如果(某物){
返回true;
} 
}
返回false;
}

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

最简单的方法是定义一个像
IdAware
这样的接口:

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

然后您可以使用此方法在动物列表中搜索。比如:

private <T extends IdAware> boolean ifExists(String id, Collection<T> animals) {
    return animals.stream().anyMatch(animal -> id.equals(animal.getId()));
}
private boolean ifExists(字符串id、集合动物){
返回animals.stream().anyMatch(animal->id.equals(animal.getId());
}
或者,如果您出于某种原因不想(或不能)拥有一个公共接口,您可以另外传递一个lambda来提取id

private <T> boolean ifExists(String id, Collection<T> animals, Function<T, String> getId) {
    return animals.stream().map(getId).anyMatch(animalId -> id.equals(animalId));
}
private boolean ifExists(字符串id、集合动物、函数getId){
返回animal.stream().map(getId).anyMatch(animalId->id.equals(animalId));
}

然后像
ifExists(“Scott”,tigers,Tiger::getTigerId)那样调用它

最简单的方法是定义一个像
IdAware
这样的接口:

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

然后您可以使用此方法在动物列表中搜索。比如:

private <T extends IdAware> boolean ifExists(String id, Collection<T> animals) {
    return animals.stream().anyMatch(animal -> id.equals(animal.getId()));
}
private boolean ifExists(字符串id、集合动物){
返回animals.stream().anyMatch(animal->id.equals(animal.getId());
}
或者,如果您出于某种原因不想(或不能)拥有一个公共接口,您可以另外传递一个lambda来提取id

private <T> boolean ifExists(String id, Collection<T> animals, Function<T, String> getId) {
    return animals.stream().map(getId).anyMatch(animalId -> id.equals(animalId));
}
private boolean ifExists(字符串id、集合动物、函数getId){
返回animal.stream().map(getId).anyMatch(animalId->id.equals(animalId));
}

然后像
ifExists(“Scott”,tigers,Tiger::getTigerId)那样调用它

我会创建一个类似这样的动物基类:

abstract class Animal {
    abstract String getId();
    abstract String getName();
}
private boolean ifExists(String s, ArrayList<AnimalId> arrList) {
    for (AnimalId o : arrList) {
        if (o.getId.equals(s)) {
            return true;
        } 
    }
    return false;
}
然后让所有其他人扩展它:

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
中,并将其与条件一起传递给
ifExists
方法

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

我将创建一个动物基类,如下所示:

abstract class Animal {
    abstract String getId();
    abstract String getName();
}
private boolean ifExists(String s, ArrayList<AnimalId> arrList) {
    for (AnimalId o : arrList) {
        if (o.getId.equals(s)) {
            return true;
        } 
    }
    return false;
}
然后让所有其他人扩展它:

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
中,并将其与条件一起传递给
ifExists
方法

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

如果您不太熟悉Java8,并且正在寻找一个简单的答案。代码如下:

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
}
这涵盖了您需要的概括。现在来看你的实际代码,应该是这样的:

abstract class Animal {
    abstract String getId();
    abstract String getName();
}
private boolean ifExists(String s, ArrayList<AnimalId> arrList) {
    for (AnimalId o : arrList) {
        if (o.getId.equals(s)) {
            return true;
        } 
    }
    return false;
}
private boolean ifExists(字符串s,ArrayList arrList){
对于(动物o:arrList){
如果(o.getId.equals){
返回true;
} 
}
返回false;
}

以防您对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
}
这涵盖了您需要的概括。现在来看你的实际代码,应该是这样的:

abstract class Animal {
    abstract String getId();
    abstract String getName();
}
private boolean ifExists(String s, ArrayList<AnimalId> arrList) {
    for (AnimalId o : arrList) {
        if (o.getId.equals(s)) {
            return true;
        } 
    }
    return false;
}
private boolean ifExists(字符串s,ArrayList arrList){
对于(动物o:arrList){
如果(o.getId.equals){
返回true;
} 
}
返回false;
}

让所有动物类实现相同的接口,如
IDAware
,它将提供一个方法
getId()
。然后,您可以传递一个
列表
,并使用
IDAware.getId()
.Override equals方法在其中进行搜索,以检查对象id并检查集合。contains(对象)其中collection是包含对象的集合一个对象一个对象类型的实例,具有您要查找的ID。@PauGómez覆盖
equals
仅检查
ID
仅用于此搜索是对我的书中
equals
的滥用。仅检查
id
可能是
等于的错误语义。如果需要通过其他属性(如
name
weight
)进行搜索,该怎么办?让所有动物类实现相同的接口,如
IDAware
,该接口将提供一个方法
getId()
。然后,您可以传递一个
列表
,并使用
IDAware.getId()
.Override equals方法在其中进行搜索,以检查对象id并检查集合。contains(对象)其中collection是包含对象的集合一个对象一个对象类型的实例,具有您要查找的ID。@PauGómez覆盖
equals
仅检查
ID
仅用于此搜索是对我的书中
equals
的滥用。仅检查
id
可能是
等于的错误语义。如果需要按其他属性(如
name
weight
)进行搜索,该怎么办?