Существует два простых способа заставить метод передавать множественные возвращаемые значения вызывающей стороне.
Первый и самый простой способ - вернуть объект, который содержит все возвращаемые значения. Это может быть коллекция, например список, или объект вашего собственного класса значений.
List<Person> matches = findMatches(peopleDB,criteria);
MatchReport report = findMatchesAsReport(peopleDB);
...
public List<Person> findMatches(PersonSource source,Criteria criteria) {
List<Person> list = new ArrayList<Person>();
while(source.hasNext()) {
Person person = source.next();
if(person.matches(criteria)) {
list.add(person);
}
}
return list;
}
Второй, более сложный способ - определить обработчик , которому ваш метод может передавать элементы при их обнаружении.
public interface PersonHandler {
public void onPerson(Person p);
}
Затем вы определяете свой метод, чтобы обработчик передавался ему:
public void findMatches(PeopleSource source, Criteria criteria, PersonHandler handler) {
while(source.hasNext()) {
Person person = source.next();
if(person.matches(criteria)) {
handler.onPerson(person);
}
}
}
Затем вызывающий абонент может определить PersonHandler, который отвечает их собственным потребностям:
private static class PrintToWriterPersonHandler implements PersonHandler {
private PrintWriter writer;
public WriteToStreamPersonHandler(PrintWriter writer) {
this.writer = writer;
}
public void onPerson(Person p) {
writer.println(person);
}
}
...
findMatches(source,criteria,new PrintToWriterPersonHandler(System.out));
Это довольно сложно и сложно для новичка. Но это стоит иметь в виду. Это означает, что вы можете иметь дело с методами, которые генерируют огромное количество ответов, без необходимости ждать завершения метода и без огромного списка в памяти. Это также означает, что вы можете иметь дело с выводом из метода, который может выполняться бесконечно!