私は通常、このソリューションを使用します。これは述語なので、再利用可能です。使用する述語に応じて、guava または Apache Commons Collections で使用できます。
public class BeanPropertyPredicate<T, V> implements Predicate<T> {
// Logger
private static final Logger log = LoggerFactory.getLogger(BeanPropertyPredicate.class);
public enum Comparison {EQUAL, NOT_EQUAL}
private final String propertyName;
private final Collection<V> values;
private final Comparison comparison;
public BeanPropertyPredicate(String propertyName, Collection<V> values, Comparison comparison) {
this.propertyName = propertyName;
this.values = values;
this.comparison = comparison;
}
@Override
public boolean apply(@Nullable T input) {
try {
PropertyDescriptor propertyDescriptor = PropertyUtils.getPropertyDescriptor(input, propertyName);
Object value = propertyDescriptor.getReadMethod().invoke(input);
switch (comparison) {
case EQUAL:
if(!values.contains(value)) {
return false;
}
break;
case NOT_EQUAL:
if(values.contains(value)) {
return false;
}
break;
}
} catch (Exception e) {
log.error("Failed to access property {}", propertyName, e);
}
return true;
}
}