您可以使用类似Guava的东西来减少代码大小,例如提供类似于功能语言风格列表理解的东西。
您也可以推出一些这方面自己的,通过定义一个接口
public interface Predicate<T> {
boolean apply(T obj);
}
,然后创建一个finder方法使用它:
B findElementByPredicate(Predicate<B> predicate) {
for (B b : list) {
if (predicate.apply(b))
return b;
}
return null;
}
你也可以(如在注释中提到)使用反射来获取字段的值。在实施arne.b的回答定义的接口,你可以定义
public class ReflectivePropertyExtractor<T, P> implements PropertyExtractor<T, P> {
String fieldName;
public ReflectivePropertyExtractor(String fieldName) {
this.fieldName = fieldName;
}
@Override
public P getProperty(T obj) {
try {
Method m = B.class.getMethod(makeAccessorName());
return (P) m.invoke(obj);
} catch (InvocationTargetException e) {
return null;
} catch (NoSuchMethodException e) {
return null;
} catch (IllegalAccessException e) {
return null;
}
}
private String makeAccessorName() {
return "get" + capitalize(fieldName);
}
private String capitalize(String s) {
if ((s == null) || (s.length() == 0))
return s;
return s.substring(0, 1).toUpperCase() + s.substring(1);
}
}
做出属性提取,对于指定的字段名的作品,并且或者使用,因为他在他的回答中描述或基于它所谓词:
public class PropertyMatchPredicate<T, P> implements Predicate<T> {
private final P matchValue;
private final PropertyExtractor<T, P> extractor;
public PropertyMatchPredicate(P matchValue, PropertyExtractor<T, P> extractor) {
this.matchValue = matchValue;
this.extractor = extractor;
}
@Override
public boolean apply(T obj) {
return matchValue.equals(extractor.getProperty(obj));
}
}
,然后使用谓词在findByPredicate
以上:
B findElementByProperty(String matchField, final String matchValue) {
final ReflectivePropertyExtractor<B, String> extractor = new ReflectivePropertyExtractor<B, String>(matchField);
return findElementByPredicate(new PropertyMatchPredicate<B, String>(matchValue, extractor));
}
如果你只处理两个属性,所有这些TAC的抽动可能会增加代码的大小,而不是减少它。优势只在更大的规模上才会发生,并且您可能会付出代价,使您的代码对不熟悉功能风格和/或反射的人员不易读取。
不应该是'for(B i:list)'? –
根据你的问题,X和Y都是相同类型的字符串。如何将泛型应用于同一类型。但可以通过反思来完成。我猜的数据类型也是B。 –