gpt4 book ai didi

java - 接受一个类对象或另一个类对象的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:48:13 24 4
gpt4 key购买 nike

我有如下两种方法

private List<Long> getIds(String name, List<Cat> cats) {
List<Long> catIds = new ArrayList<>();
for (Cat cat : cats) {
if (cat.getName().equals(name)) catIds.add(cat.getId());
}
return catIds;
}

private List<Long> getIds(String name, List<Dog> dogs) {
List<Long> dogIds = new ArrayList<>();
for (Dog dog : dogs) {
if (dog.getName().equals(name)) dogIds.add(dog.getId());
}
return dogIds;
}

我的猫狗类如下

public class Cat {
String name;
Long id;
// additional variables
// getters and setters
}

public class Dog {
String name;
Long id;
// additional variables
// getters and setters
}

为了避免冗余,我想将上述两个方法转换为一个泛型方法。

我尝试了以下方法

private List<Long> getIds(String name, List<T> objects) {
List<Long> ids = new ArrayList<>();
for (T object : objects) {
if (object.getName().equals(name)) ids.add(object.getId());
}
return ids;
}

但它没有成功,因为它提示通用 T 没有 getNamegetId

这里的 CatDog 是内置的 java 类。因此,我不能执行继承并为它们提供父类(super class)Animal,其中nameid 作为数据变量.

有什么方法可以在不实现继承的情况下完成上述两种方法的合并?

最佳答案

另一种可能性:如果您使用的是 Java 8,则可以将名称和 ID 的 getter 方法作为附加参数传入该方法。这是类型安全的,既不需要反射也不需要修改原始类。

private <T> List<Long> getIds(String name, List<T> objects, Function<T, String> getName, Function<T, Long> getId) {
List<Long> ids = new ArrayList<>();
for (T object : objects) {
if (getName.apply(object).equals(name)) {
ids.add(getId.apply(object));
}
}
return ids;
}

或更短,使用流:

private <T> List<Long> getIds(String name, List<T> objects, Function<T, String> getName, Function<T, Long> getId) {
return objects.stream().filter(o -> getName.apply(o).equals(name))
.map(getId).collect(Collectors.toList());
}

用法:

List<Long> ids = getIds("some name", listOfCats, Cat::getName, Cat::getId);

当然,虽然这种方法的主体在所有情况下都是相同的,但您必须以不同的方式调用它,具体取决于输入。为此,您可以提供一个入口方法,以适当的方式调用其他方法或在类型错误的情况下引发异常。

private List<Long> getIds(String name, List<?> objects) {
if (objects.size() == 0) {
return Collections.emptyList();
}
if (objects.get(0) instanceof Cat) {
return getIds(name, (List<Cat>) objects, Cat::getName, Cat::getId);
}
if (objects.get(0) instanceof Dog) {
...
}
throw new IllegalArgumentException("List containing unsupported type!");
}

关于java - 接受一个类对象或另一个类对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36031635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com