Вы должны использовать Iterables.filter(Iterable, Predicate)
в сочетании с Predicate
с.
Пример:
public class PersonLastNameEqualsPredicate implements Predicate<Person> {
private String personName;
public PersonNameEqualsPredicate (String personName) {this.personName= personName;}
public boolean apply(Person p) { return this.personName.equals(p.getLName()); }
}
public class PersonStreet1EqualsPredicate implements Predicate<Person> {
private String street1Name;
public PersonStreet1EqualsPredicate (String street1Name) {this.street1Name = street1Name;}
public boolean apply(Person p) {
for (Address a: p.getAddresses()) {
if (street1Name.equals(a.getStreet1()) return true;
}
return false;
}
}
// Extra predicates as you need them
Вам нужен один предикат для каждого элемента сценария. Тогда вам нужно модулировать их так, как вам нужно:
1
Predicate<Person> peopleNamedZoik = new PersonLastNamePredicate("zoik");
2
Predicate<Person> peopleNamedSmarkAndLivingInXyzStreet = Predicates.and(new PersonLastNamePredicate("smark"), new PersonStreet1EqualsPredicate("xyz"));
3
Здесь вы должны адаптировать предикат улицы, чтобы сразу проверить, соответствуют ли все названия улиц вашим ожиданиям.
Тогда это просто вопрос
1
List<Person> myLongPersonList = ...;
Iterable<Person> zoikPeople = Iterables.filter(myLongPersonList, peopleNamedZoik);
2.
List<Person> myLongPersonList = ...;
Iterable<Person> zoikPeople = Iterables.filter(myLongPersonList, peopleNamedSmarkAndLivingInXyzStreet);
и т. Д.