Me pregunto si es posible hacer este método mejor, así que tengo este método:
public int getLabelIdByLabelName(String labelName) throws ApiException {
List<LabelInfo> labelsList = getAllLabels();
return labelsList.stream()
.filter(label -> label.getName().equals(labelName))
.findFirst()
.map(LabelInfo::getId)
.orElse(0);
}
Y este es el método que está utilizando:
public void enableSpecificDevices(RuleIdentifier identifier, String[] labelNames) throws ApiException {
List<Integer> labelsIdList = getLabelListById(identifier);
for (String labelName : labelNames) {
labelsIdList.remove(Integer.valueOf(deviceAPI.getLabelIdByLabelName(labelName)));
}
DisableRequest disableRequest = getDisableRequestBody(deviceIdList, labelsIdList);
sendDisableEnableRequest(disableRequest, identifier);
}
Este método devuelve int
el valor: deviceAPI.getLabelIdByLabelName(labelName)
.
Como se puede ver en el bucle for que estoy llamando getLabelIdByLabelName
cada vez y luego realizar la I necesidad lógica, su consumo de recursos sin razón me pregunto cómo devolver la lista de números enteros de esta lista, que será algo como esto: conseguir Lista vez bucle sobre la matriz de nombres que será igual al nombre y añadiéndola a un nuevo lista de números enteros y devolverlo.
Puede simpliify si recoja el labelName
y su id
a una Map
y luego usar ese Map
en su método de servicio, tales como:
public Map<String, Integer> labelIdByNameMap() throws ApiException {
List<LabelInfo> labelsList = getAllLabels();
Map<String, Integer> labelNameToIdMap = labelsList.stream()
.collect(Collectors.toMap(LabelInfo::getName, LabelInfo::getId));
return labelNameToIdMap;
}
utilizando además como:
public void enableSpecificDevices(RuleIdentifier identifier, String[] labelNames) throws ApiException {
Set<String> labelNameSet = Arrays.stream(labelNames).collect(Collectors.toSet());
List<Integer> filteredValuesToRemove = labelIdByNameMap().entrySet().stream()
.filter(e -> labelNameSet.contains(e.getKey()))
.map(Map.Entry::getValue)
.collect(Collectors.toList());
List<Integer> labelsIdList = getLabelListById(identifier);
labelsIdList.removeAll(filteredValuesToRemove);
DisableRequest disableRequest = getDisableRequestBody(deviceIdList, labelsIdList);
sendDisableEnableRequest(disableRequest, identifier);
}
Nota al margen, en un escenario de la vida real, la consulta de todas las etiquetas podría llegar a ser algún costoso, en donde no debe haber compensaciones evaluados entre el procesamiento de todos los elementos en la memoria frente a la realización de lotes lee en comparación con las operaciones de búsqueda de base de datos único, basado en el name
para obtener la id
proyectada.