在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
)进行搜索,该怎么办?