Как конвертировать Список <Object>в Список <T>? - PullRequest
0 голосов
/ 29 августа 2018

Это код для получения ответа о модификации в качестве объекта. Приведенный ниже метод работает нормально, но мне нужна одна общая функция для выполнения вышеуказанных функций, то есть имя класса может отличаться. (например, билет, цена, жетон, встреча, как это:

processGETRequest(AppController.getApiHelper().searchTickets(from, to), new RetrofitListener() {
    @Override
    public void onSuccess(Object object) { }

    @Override
    public void onSuccess(List<Object> object) {

        // Here I'm getting retrofit response as a object //

        if (object != null) {

            // Below method is working fine //

            List<Ticket> ticketList = new ArrayList<>();
            for (Object result : object) {
                String json = new Gson().toJson(result);
                Ticket model = new Gson().fromJson(json, Ticket.class);
                ticketList.add(model);
            }

            // I need an one common function for performing above functionality
            // i.e the Class name may vary.. (e.g) Ticket, Price, Token, Appointment like this.
        }
    }

    @Override
    public void onError(String error) {
        Log.d("error: ", " " + error);
    }
}, false);

Интерфейс RetrofitListener это просто:

public interface RetrofitListener {
    void onSuccess(Object object);
    void onSuccess(List<Object> object);
    void onError(String error);
}

Ответы [ 4 ]

0 голосов
/ 29 августа 2018

Так как по вашему вопросу вы хотите, чтобы общий код получал List, который может быть любого? типа.

List<Ticket> ticketList = new ArrayList<>();
                    for (Object result : object) {
                        String json = new Gson().toJson(result);
                        Ticket model = new Gson().fromJson(json, Ticket.class);
                        ticketList.add(model);
                    }

это то, что вы хотите?

List<Ticket> ticketList // can be List<T>??

Затем создайте универсальный метод для получения списка и используйте его в любом месте:

public <T> List<T> getObjectToList(Object obj, Class<T[]> ObjectArryaClass) {
    String json = new Gson().toJson(obj);
    return Arrays.asList(new Gson().fromJson(json, ObjectArryaClass));
}

вызов метода выше как:

@Override
    public void onSuccess(List<Object> object) {

        // Here I'm getting retrofit response as a object //

        if (object != null) {

            // Below method is working fine //

            List<Ticket> ticketList = getObjectToList(object,Ticket[].class)

            // I need an one common function for performing above functionality
            // i.e the Class name may vary.. (e.g) Ticket, Price, Token, Appointment like this.
        }
    }
0 голосов
/ 29 августа 2018

Вы можете преобразовать фрагмент

if (object != null) { 
                        List<Ticket> ticketList = new ArrayList<>();
                        for (Object result : object) {
                            String json = new Gson().toJson(result);
                            Ticket model = new Gson().fromJson(json, Ticket.class);
                            ticketList.add(model);
                        }    
                    }

с такими дженериками

<T> void check(Class<T> type, List<Object> object) {
        List<T> ticketList = new ArrayList<>();
        for (Object result : object) {
            String json = new Gson().toJson(result);
            T model = new Gson().fromJson(json, type);
            ticketList.add(model);
        }
    }
0 голосов
/ 29 августа 2018

Вы можете использовать статическую функцию, аналогичную:

static <T> List<T> toList(List<Object> object, Class<T> desiredClass) {
    List<T> transformedList = new ArrayList<>();
    if (object != null) {
      for (Object result : object) {
          String json = new Gson().toJson(result);
          T model = new Gson().fromJson(json, desiredClass);
          transformedList.add(model);
      }
    }
    return transformedList;
}

В основном вам просто нужно убедиться, что вы доставляете нужный тип (например, desiredClass) и используете его в fromJson.

Пример использования:

List<Ticket> ticketList = toList(object, Ticket.class);
List<Price> priceList = toList(object, Price.class);

Обратите внимание, что при перемещении object != null в toList -метод вам не нужно заботиться о том, что передается этому методу. Вы по крайней мере получите пустой список взамен.

0 голосов
/ 29 августа 2018
<T> List<T> getList(Class<T> type, List<Object> object) {
    return object.stream()
            .map(result -> new Gson().toJson(result))
            .map(new Gson().fromJson(json, type))
            .collect(Collectors.toList());
}

List<Ticket> ticketList = getList(Ticket.class, object);

Это сделает то, что сделал ваш цикл for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...