Java 8 foreach añadir a la nueva lista si un elemento de la segunda lista cumplir condiciones y devuelve una nueva lista

Tupac Shakur :

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 intel valor: deviceAPI.getLabelIdByLabelName(labelName).

Como se puede ver en el bucle for que estoy llamando getLabelIdByLabelNamecada 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.

también:

Puede simpliify si recoja el labelNamey su ida una Mapy luego usar ese Mapen 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 namepara obtener la idproyectada.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=292776&siteId=1
Recomendado
Clasificación