private Feature findFeature(String name, List<Feature> list) {
for (Feature item : list) {
if (item.getName().equals(name)) {
return item;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
我还有 10 个类似的方法。相同的签名,相同的逻辑。唯一不同的是 List 参数使用不同的对象,例如List<Data> list、 或List<Option> list等。所有对象都有一个getName()方法。我想创建一个通用方法并删除所有其他方法。
如果我使用这样的东西,
private <T> T findInList(String name, List<T> list) {
Run Code Online (Sandbox Code Playgroud)
我无权访问该getName()方法。创建此方法的最简单方法是什么?反射 api 是唯一的选择吗?
编辑:
我发现了我犯的错误。它工作得很好,像这样:
for (FeatureEntity entity : data.getFeatures()) {
Predicate<Feature> filter = f -> f.getName().equalsIgnoreCase(entity.getName());
if (entity.getFeatureId() != null && findInList(featureList, filter) == null) {
FeatureEntity n = new FeatureEntity();
n.setId(entity.getId());
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
您可以创建通用方法,该方法采用通用列表Predicate来获取过滤后的第一个匹配项
private <T> T findFeature(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findFirst().orElse(null);
}
Run Code Online (Sandbox Code Playgroud)
然后Predicate使用所需的类型创建并调用该方法
Predicate< Feature > filter = f->f.getName().equalsIgnoreCase(name);
findFeature(list,filter);
Run Code Online (Sandbox Code Playgroud)
另一方面,您也可以在没有找到元素时返回Optional<T>,而不是返回:null
private <T> Optional<T> findFeature(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findFirst();
}
Run Code Online (Sandbox Code Playgroud)