【问题标题】:How to convert List<Object> into List<T>?如何将 List<Object> 转换为 List<T>?
【发布时间】:2019-02-03 21:17:09
【问题描述】:

这是获取改造响应作为对象的代码。下面的方法工作正常,但我需要一个通用函数来执行上述功能,即类名可能会有所不同。 (例如)门票、价格、代币、约会这样的:

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);
}

【问题讨论】:

  • 另外,为什么要解析 JSON?您可以将结果转换为票证。 ticketList.add((Ticket) result);
  • 我写了一个常用的方法来获取所有的 api,所以我把改造的所有响应收集为一个对象/对象列表。然后我将结果解析为上面写的所需类
  • 你是在用retrofit 2吗,能把服务类和RetrofitListener类贴出来

标签: java android list object generics


【解决方案1】:

您可以使用类似于以下的静态函数:

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 方法中,您无需关心传递给该方法的内容。作为回报,您至少会得到一个空列表。

【讨论】:

  • 哇...只有 20 分钟路程,答案已准备好但未发送...已经有 4 个其他人.. 1 个已删除...我变老了
【解决方案2】:
<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 循环所做的事情。

【讨论】:

  • 你是对的,使用流不是一个好主意,因为它需要 API >= 24。但是流 API 是一个很棒的功能。我应该考虑使用 LightWeght Stream API github.com/aNNiMON/Lightweight-Stream-API
  • 我们也可以使用 RxJava Sequence 代替 Stream。
  • 你们,你们是对的,这是一个 java 8 主要的“流”解决方案。事实上,实际上是 T 的 List&lt;Object&gt; 也是可行的,没有流,只有 for 循环。
【解决方案3】:

你可以转换sn-p

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);
        }
    }

【讨论】:

  • 我已经尝试过这个解决方案。它会起作用的。 result.getClass() 将自动检查来自 object 的类。如果您仍然不满意,您可以将Class&lt;T&gt; type 传递给方法check(Class&lt;T&gt; type, List&lt;Objects&gt; object) 并将T model = new Gson().fromJson(json, result.getClass()); 更改为T model = new Gson().fromJson(json, type);
【解决方案4】:

根据您的问题,您想要一个通用代码来获取可以是 Any 的 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.
        }
    }

【讨论】:

  • getObjectToList(object,Ticket[].class) 你可以使用任何类代替 Ticket 类。但总是给 T[].ckass
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2017-09-20
  • 2023-03-08
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多