有可能把这些方法结合起来吗?(Java泛型)

有可能把这些方法结合起来吗?(Java泛型),java,class,generics,Java,Class,Generics,我正在为大学做家庭作业,不允许我改变班级的性质。我为一个搜索方法想出了以下代码,但我忍不住注意到重复的代码。我需要建立两个搜索方法。一个搜索ArrayList的,另一个搜索ArrayList的{ 如果(s.name.contains(query))匹配.add(s); }); 返回匹配; } 公共静态ArrayList findModule(列表、字符串查询){ ArrayList匹配=新的ArrayList(); 列表。forEach(s->{ 如果(s.name.contains(query

我正在为大学做家庭作业,不允许我改变班级的性质。我为一个搜索方法想出了以下代码,但我忍不住注意到重复的代码。我需要建立两个搜索方法。一个搜索
ArrayList
的,另一个搜索
ArrayList的{
如果(s.name.contains(query))匹配.add(s);
});
返回匹配;
}
公共静态ArrayList findModule(列表、字符串查询){
ArrayList匹配=新的ArrayList();
列表。forEach(s->{
如果(s.name.contains(query))匹配.add(s);
});
返回匹配;
}
是否可以在不改变类结构的情况下组合这些方法?我尝试了一些类似的方法,但似乎仍然不起作用:(方法签名中的不同类型参数)

公共静态ArrayList findModule(列表、字符串查询){
ArrayList匹配=新的ArrayList();
列表。forEach(s->{
如果(s.name.contains(query))匹配.add(s);
});
返回匹配;
}
编辑:以下是课程:

public abstract class Person extends TableItem {

public String name, famName, street, zip, city;
public String[] data = new String[7];

...
}

public class Module extends TableItem {

private Manager manager;
public String[] data = new String[5];
public String name, nr, profID, semester, part;
public ArrayList<String> participants;

...
}

public abstract class TableItem {

public abstract String getString();
public abstract void updateData();
}
公共抽象类Person扩展TableItem{
公共字符串名称,famName,street,zip,city;
公共字符串[]数据=新字符串[7];
...
}
公共类模块扩展了TableItem{
私人经理;
公共字符串[]数据=新字符串[5];
公共字符串名称、nr、profID、学期、部分;
公众参与;
...
}
公共抽象类TableItem{
公共抽象字符串getString();
公共摘要void updateData();
}

为泛型类型指定多个基类型的唯一方法是使用
&
语法:

<T extends Person & Module>
现在,如果
Person
Module
都扩展/实现了
命名的
接口,那么您的方法可以是:

public static <T extends Named> ArrayList<T> findNamed(List<T> list, String query) {
    return list.stream().filter(s -> s.getName().contains(query))
               .collect(Collectors.toCollection(ArrayList::new));
}
publicstaticarraylistfindnamed(列表,字符串查询){
return list.stream().filter(s->s.getName().contains(查询))
.collect(收集器.toCollection(ArrayList::new));
}

理想情况下,您可以让两个类实现相同的接口,比如
NamedItem
,它将有一个函数
getName()
,这会简单得多,因为您可以让函数采用
ListDo
Person
Module
实现相同的接口,或者扩展相同的基类?不,他们没有。编辑哦,是的,但这不是我需要搜索的领域。你能把这些类放到你的问题里吗?如果您决定让它们实现一个公共接口,这是一个问题吗?名称(和其他字段)是否有getter方法?@rgetman是的,我现在意识到确实存在一个公共getter
getString()
,它是类中几个字符串字段的串联。其中一个组件是
name
,因此
String.contains
方法将起作用。
<T extends Person & Module>
public interface Named {
    String getName();
}
public static <T extends Named> ArrayList<T> findNamed(List<T> list, String query) {
    return list.stream().filter(s -> s.getName().contains(query))
               .collect(Collectors.toCollection(ArrayList::new));
}
public static <T> List<T> find(List<T> list, String query, Function<T, String> keyExtractor) {
    return list
        .stream()
        .filter(s -> keyExtractor.apply(s).contains(query))
        .collect(Collectors.toList());
}
List<Person> matchingPersons = find(allPersons, query1, Person::getName);
List<Module> matchingModules = find(allModules, query1, Module::getName);