【问题标题】:Not able to iterate arraylist which contains linked hashmap无法迭代包含链接哈希图的数组列表
【发布时间】:2019-02-07 05:31:40
【问题描述】:

我正在尝试使用 for 循环遍历 Object 类的 ArrayList 实例:

for(PayloadDTO payloadDTO:payloadDTOList) {
    if(payloadDTO.getEntType().equals(CommonConstants.CUSTOMENTTYPEROLEID.RES_ROLE_TYPE)) {
        resRoleNameList.add(payloadDTO.getEntName());
    } 
}

这给了我以下错误:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.alnt.fabric.external.model.PayloadDTO
    at com.alnt.fabric.external.rbac.service.ExternalFabricService.loadImpactedUserCount(ExternalFabricService.java:384)
    at com.alnt.fabric.external.rbac.controller.ExternalFabricController.loadImpactedUserCount(ExternalFabricController.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)

所以我尝试使用下面的代码进行转换:

payloadDTOList = convert(payloadDTOList.toString(), List<PayloadDTO.class>);


    public static <T> T convert(String json, Class<T> type) throws ALNTApplicationException {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.readValue(json, type);
    } catch (Exception e) {
        throw new ALNTApplicationException(FabricComponentErrorCodes.ACTION_HANDLER_ERROR_CODE,"Object conversion error");
    }
}

【问题讨论】:

  • 你能在这里发布你的迭代循环吗?我认为问题在于您尝试迭代它的方式。
  • @Jainik 添加循环

标签: java linkedhashmap


【解决方案1】:

尝试使用强制转换的 for 循环

for (int i=0; i < payloadDTOList.size(); i++) {
    PayloadDTO payloadDTO = (PayloadDTO) payloadDTOList.get(i);       
    if(payloadDTO.getEntType().equals(CommonConstants.CUSTOMENTTYPEROLEID.RES_ROLE_TYPE)) {
      resRoleNameList.add(payloadDTO.getEntName());
    }
}

【讨论】:

    【解决方案2】:

    将 json 数组转换为集合使用这个:

    payloadDTOList = 
        convert(
            payloadDTOList.toString(),
            TypeFactory.defaultInstance().constructCollectionType( 
                List.class , 
                PayloadDTO.class
            )
        );
    

    并将方法更改为:

    public static <T> T convert(String json, JavaType type) throws ALNTApplicationException {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readValue(json, type);
        } catch (Exception e) {
            throw new ALNTApplicationException(FabricComponentErrorCodes.ACTION_HANDLER_ERROR_CODE,"Object conversion error");
        }
    }
    
    
    public static <T> T convert(String json, Class<T> type) throws ALNTApplicationException {
        return convert( 
                json , 
                TypeFactory.defaultInstance().constructType( 
                        type 
                ) 
        );
    }
    

    【讨论】:

    • 感谢您的快速帮助。现在它给了我一个读取值错误:- ObjectMapper 类型中的方法 readValue(String, Class) 不适用于参数 (String, JavaType)
    • 仍然遇到同样的问题
    • 还有什么问题?
    • 读取值出错:- ObjectMapper 类型中的方法 readValue(String, Class) 不适用于参数 (String, JavaType)
    • 你添加了两种重载方法吗?这个方法有一个String , Class&lt;T&gt; 参数?
    【解决方案3】:

    您可以迭代 ArrayList 并基于它创建一个新的对象列表。然后您可以使用 forEach 迭代 payloadDTOList2。

    List<PayloadDTO> payloadDTOList2 = new ArrayList<>();
    for (int i=0; i < payloadDTOList.size(); i++) {
       LinkedHashMap<String,String> linkedHash = (LinkedHashMap<String, String>) payloadDTOList.get(i);
       PayloadDTO payloadDTO =  new PayloadDTO();
       payloadDTO.setEntType(linkedHash.get("EntType"));
       payloadDTO.setEntName(linkedHash.get("EntName"));
       payloadDTOList2.add(payloadDTO);
    }
    

    【讨论】:

      【解决方案4】:

      正如我们在 snap 中看到的那样,列表 payloadDTOList 的类型为 LinkedHashMap,您正尝试将其分配到 PayloadDTO for(PayloadDTO payloadDTO:payloadDTOList)

      如果您确定列表 payloadDTOList 中的所有对象都是 LinkedHashMap 类型,则使用如下:for(LinkedHashMap map:payloadDTOList)

      如果您不确定列表中的对象类型,请使用普通的 for 循环。

      for (int i=0; i < payloadDTOList.size(); i++) {
          if(payloadDTOList.get(i) instanceof PayloadDTO)
               PayloadDTO payloadDTO = (PayloadDTO) payloadDTOList.get(i);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 1970-01-01
        • 2015-11-08
        相关资源
        最近更新 更多