Пропуск вашей путаницы Iterator / Iterable (а Iterable - это, по сути, фабрика Iterator ... поэтому вам нужно написать Iterator в любом случае), я думаю, вы имеете в виду что-то подобное:
Iterator<Test> getTests(final Map<String,Test> testMap, final Set<String> strings) {
return new Iterator<Test>() {
private final Iterator<String> keyIter = strings.iterator();
private String lastKey;
public boolean hasNext() { return keyIter.hasNext(); }
public Test next() { lastKey = keyIter.next(); return testMap.get(lastKey); }
public void remove() { testMap.remove(lastKey); }
};
}
И если вы хотите вернуть Iterable, ну, это просто фабрика для тех:
Iterable<Test> getTests(final Map<String,Test> testMap, final Set<String> strings) {
return new Iterable<Test>() {
public Iterator<Test> iterator() {
return new Iterator<Test>() {
private final Iterator<String> keyIter = strings.iterator();
private String lastKey;
public boolean hasNext() { return keyIter.hasNext(); }
public Test next() { lastKey = keyIter.next(); return testMap.get(lastKey); }
public void remove() { testMap.remove(lastKey); }
};
}
};
}
Для дополнительного кредита, вы можете параметризовать сам этот метод и иметь общий способ перебора выбора на карте:
Map<String, Action> map;
Set<String> keys;
for (Action x : filterMap(map, keys)) {
}