Java 8 foreach добавить в новый список, если один элемент из второго списка удовлетворяет условию и возвращает новый список - PullRequest
4 голосов
/ 16 марта 2020

Интересно, возможно ли сделать этот метод лучше, поэтому у меня есть этот метод:

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

И этот метод использует его:

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

Этот метод возвращает int значение: deviceAPI.getLabelIdByLabelName(labelName).

Как вы можете видеть в for l oop, я звоню getLabelIdByLabelName каждый раз, а затем выполняю логи c, которые мне нужны, ее ресурс потребляет для нет причин, я задаюсь вопросом, как вернуть список целых чисел из этого списка, который будет выглядеть примерно так: получить List один раз зацикливаясь на массиве имен, который будет равен имени, и добавить его в новый список целых чисел и вернуть его.

1 Ответ

2 голосов
/ 16 марта 2020

Вы можете упростить его, если соберете labelName и его id в Map, а затем используйте это Map в своем методе обслуживания, таком как:

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

, используя его далее as:

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

Дополнительное примечание: в реальном сценарии запрос всех меток может в какой-то момент оказаться дорогостоящим, при этом должны быть оценены компромиссы между обработкой всех элементов в памяти и выполнением Пакетное чтение по сравнению с поиском в одной базе данных на основе name для получения проекции id.

...