我想知道是否可以使这种方法更好,所以我有这种方法:
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循环中看到的那样,我getLabelIdByLabelName每次都在调用然后执行我需要的逻辑,它无缘无故地消耗资源,我想知道如何从该列表返回整数列表,这将是这样的:循环一次获取List在与名称相同的名称数组上,并将其添加到新的整数列表中并返回。
问题来源:Stack Overflow
如果将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;
}
进一步将其用作:
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预期的结果。
回答来源:Stack Overflow
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。