Как динамически получить поле из универсального объекта <T>? - PullRequest
1 голос
/ 17 марта 2019

Существуют фиксированные шаги, чтобы сделать что-то, поэтому я извлек это как общий метод, см. Ниже

private static <T>void commonMethod(GetListAction getListAction, Function<T, Integer> tObjectFunction) {
    List<T> list = getListAction.action();
    List<Integer> proIdList = list.stream().map(tObjectFunction).collect(Collectors.toList());
    List<ProEntity> proEntityList = getProEntityListByProIdList(proIdList);
    // do something with proEntityList
    // ...

}
interface GetListAction<T> {
    List<T> action();
}

Теперь в различий я вызываю общий метод, как показано ниже

commonMethod(()->getFooList(), Foo::getProId);


commonMethod(()->getBarList(), Bar::getProId); 

но я все еще хочу знать, можно ли удалить второй параметр в commonMethod?

private static <T>void commonMethod(GetListAction getListAction)

но как в этом случае получить proIdList из списка

List<Integer> proIdList = list.stream().map(???).collect(Collectors.toList());

1 Ответ

2 голосов
/ 17 марта 2019

Один из способов избавиться от Function<T, Integer> tObjectFunction - сделать T подтипом интерфейса. Например:

interface Action {
    Integer getProdId();
}

Foo и Bar будут реализовывать этот интерфейс, и, поскольку у них уже есть методы getProdId(), это должно быть легко.

Это позволит вам объявить ваш метод как

private static <T extends Action> void commonMethod(GetListAction<T> getListAction) {
    List<T> list = getListAction.action();
    List<Integer> proIdList = list.stream()
                 .map(Action::getProdId)
                 .collect(Collectors.toList());
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...