private Feature findFeature(String name, List<Feature> list) {
for (Feature item : list) {
if (item.getName().equals(name)) {
return item;
}
}
return null;
}
我还有其他10种这样的方法。相同的签名,相同的逻辑。唯一不同的是List参数使用不同的对象,例如List list,或List
list等。所有对象中都有一个getName()方法。我想创建一个通用方法并删除所有其他方法。如果我使用这样的东西,
private <T> T findInList(String name, List<T> list) {
我没有访问该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());
// ...
}
}
问题来源:Stack Overflow
您可以创建采用通用列表的通用方法,以Predicate在过滤后获取第一个匹配项
private <T> T findFeature(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findFirst().orElse(null);
}
然后Predicate使用所需的类型创建并调用该方法
Predicate< Feature > filter = f->f.getName().equalsIgnoreCase(name);
findFeature(list,filter);
另一方面,也可以返回Optional 而不是null找不到元素时返回:
private <T> Optional<T> findFeature(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findFirst();
}
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。