private Feature findFeature(String name, List<Feature> list) {
for (Feature item : list) {
if (item.getName().equals(name)) {
return item;
}
}
return null;
}
Tengo otros 10 métodos como éste. Misma firma, misma lógica. Sólo diferente es que el parámetro de lista está utilizando diferentes objetos, por ejemplo List<Data> list
, o List<Option> list
, etc. Todos los objetos tiene un getName()
método en ella. Quiero crear un método genérico y eliminar todos los demás.
Si uso algo como esto,
private <T> T findInList(String name, List<T> list) {
No tengo acceso al getName()
método. ¿Cuál es la forma más fácil de crear este método? Es API de reflexión la única opción?
EDITAR:
He encontrado el error que yo. Está trabajando muy bien como esto:
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());
// ...
}
}
Puede crear método genérico que se lleva a lista genérica con Predicate
conseguir el primer elemento coincidente después de filtrar
private <T> T findFeature(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findFirst().orElse(null);
}
Y luego crear Predicate
con el tipo requerido y llamar a ese método
Predicate< Feature > filter = f->f.getName().equalsIgnoreCase(name);
findFeature(list,filter);
Por otro lado, también se puede devolver Optional<T>
en lugar de null
cuando no se encuentra ningún elemento:
private <T> Optional<T> findFeature(List<T> list, Predicate<T> predicate) {
return list.stream().filter(predicate).findFirst();
}