无法迭代包含链接哈希图的数组列表
Not able to iterate arraylist which contains linked hashmap
我正在尝试使用 for 循环迭代对象 class 的 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");
}
}
要将 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
)
);
}
尝试使用强制转换的 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());
}
}
正如我们快速看到的那样,列表 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);
}
}
您可以迭代 ArrayList 并基于 that.Then 创建一个新的对象列表您可以使用 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);
}
我正在尝试使用 for 循环迭代对象 class 的 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");
}
}
要将 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
)
);
}
尝试使用强制转换的 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());
}
}
正如我们快速看到的那样,列表 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);
}
}
您可以迭代 ArrayList 并基于 that.Then 创建一个新的对象列表您可以使用 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);
}