У вас есть базовый класс, который уже позволяет вам аккуратно программировать интерфейс. Вы можете спроектировать этот метод API так, чтобы он возвращал объект List
, сохраняя общий тип на уровне элемента.
Обратите внимание, что этот шаблон уже предоставляется стандартным API (Список / Коллекция + Поток), поэтому вам не нужно создавать его заново. - см. примечание внизу.
Если у вас нет никаких ограничений относительно типа списка , возвращаемого методом, то выбор этой реализации зависит от того, какой тип списка он возвращает (используя список массивов ниже):
public static <T> List<T> filterList(List<T> list, Predicate<T> predicate) {
List<T> newList = new ArrayList<>(); //You can choose a different type here
list.forEach(s -> {
if (predicate.test(s)) newList.add(s);
});
return newList;
}
Если вы предоставляете вызывающей стороне возможность выбрать , какой тип списка создается , то, возможно, вам следует воспользоваться фабрикой:
public static <U, T extends List<U>> T filterList(T list,
Predicate<U> predicate, Supplier<T> newListFactory) {
T newList = newListFactory.get(); //You can choose a different type here
list.forEach(s -> {
if (predicate.test(s))
newList.add(s);
});
return newList;
}
Примечание : этот шаблон уже предоставляется API коллекций:
java.util.stream.Stream.filter(Predicate<? super T>)
Это позволяет вам делать то же самое, за исключением того, что создание возвращаемого списка (скажем, вы запустили collect(Collectors.toList())
)