List<BusinessAreaNameAndTableName> businessAreaNameAndTableNames = dataInfoMapper.selectBusinessDomainName(tabNames); Map<String,Set<String>> map =new HashMap<>(); for (int i = 0; i < businessAreaNameAndTableNames.size(); i++) { Set<String> value = new HashSet<>(); map.put(businessAreaNameAndTableNames.get(i).getTabName(),value); value.clear(); for (int j = 0; j < businessAreaNameAndTableNames.size(); j++) { if (businessAreaNameAndTableNames.get(i).getTabName().equals(businessAreaNameAndTableNames.get(j).getTabName())){ String businessAreaName = businessAreaNameAndTableNames.get(j).getBusinessAreaName(); value.add(businessAreaName); } } }通过java stream流优化
时间: 2024-02-06 21:11:13 浏览: 102
可以使用Java 8的Stream API对这段代码进行优化,可以尝试以下代码:
```
Map<String, Set<String>> map = businessAreaNameAndTableNames.stream()
.collect(Collectors.groupingBy(
BusinessAreaNameAndTableName::getTabName,
Collectors.mapping(BusinessAreaNameAndTableName::getBusinessAreaName, Collectors.toSet())
));
```
这段代码通过Stream的`groupingBy`方法将`BusinessAreaNameAndTableName`对象按照`tabName`属性进行分组,并将`businessAreaName`属性映射为一个Set集合,最终得到一个`Map<String, Set<String>>`类型的结果。这样可以避免使用循环和中间的`HashMap`对象,使代码更加简洁和易读。
相关问题
用java写import java.util.*; public class Main { public static void main(String[]) { Set<Integer> set = new TreeSet<>(Arrays.asList(1, 2, 6, 5, 3, 4)); List<String> list = Arrays.asList("aa", "cc", "bb", "d", "f", "e"); Map<Integer, String> map = new HashMap<>(); Iterator<Integer> itSet = set.iterator(); Iterator<String> itList = list.iterator(); while (itSet.hasNext() && itList.hasNext()) { map.put(itSet.next(), itList.next()); } System.out.println(map); } }
这段代码的作用是将一个 Set 和一个 List 合并成一个 Map,其中 Set 中的元素作为 Map 的 key,List 中的元素作为 Map 的 value,最后输出这个 Map。
具体实现是,先创建一个 TreeSet 对象 set,其中包含 1, 2, 6, 5, 3, 4 这几个元素。再创建一个 List 对象 list,其中包含 "aa", "cc", "bb", "d", "f", "e" 这几个元素。然后创建一个 HashMap 对象 map,用于存放合并后的结果。
接着,创建两个迭代器 itSet 和 itList 分别对 set 和 list 进行遍历,然后将迭代器 itSet 和 itList 所指向的元素依次作为 key 和 value 存入 map 中。最后,输出这个 map 即可。
输出结果为:{1=aa, 2=bb, 3=d, 4=e, 5=f, 6=cc}。
Set<String> gatherTimeList = eSResponseList.stream() .map(DevPortReportEsDTO::getGatherTime) // 获取目标字段的值 .collect(Collectors.toSet()); // 转为列表 Map<String, DevPortReportEsDTO> reportEsDTOMap = new HashMap<>(); Map<String, List<PortReportResultVo>> relayLinkAndPortMap1 = new HashMap<>(); for (Map.Entry<String, List<TrDevportVO>> entry : relayLinkAndPortListMap.entrySet()) { String key = entry.getKey(); List<TrDevportVO> values = entry.getValue(); List<PortReportResultVo> resultVoList = new ArrayList<>(); for (String gatherTime : gatherTimeList) { for (TrDevportVO trDevportVO : values) { String tempKey = trDevportVO.getDevId() + trDevportVO.getPortName() + gatherTime; DevPortReportEsDTO reportEsDTO = reportEsDTOMap.get(tempKey); PortReportResultVo reportResultVo = new PortReportResultVo(); BeanUtil.copyProperties(trDevportVO, reportResultVo); reportResultVo.setPortBandwidth(trDevportVO.getBandwidth()); BeanUtil.copyProperties(reportEsDTO, reportResultVo); resultVoList.add(reportResultVo); } // key为链路组id+ 采集时间 relayLinkAndPortMap1.put(key + "@" + gatherTime, resultVoList); } } 优化一下这段代码
可以考虑将两个循环嵌套的部分使用 Stream 进行优化,减少循环次数,如下所示:
```
Map<String, List<PortReportResultVo>> relayLinkAndPortMap1 = relayLinkAndPortListMap.entrySet().stream()
.flatMap(entry -> gatherTimeList.stream()
.map(gatherTime -> {
String key = entry.getKey();
List<TrDevportVO> values = entry.getValue();
return values.stream()
.map(trDevportVO -> {
String tempKey = trDevportVO.getDevId() + trDevportVO.getPortName() + gatherTime;
DevPortReportEsDTO reportEsDTO = reportEsDTOMap.get(tempKey);
PortReportResultVo reportResultVo = new PortReportResultVo();
BeanUtil.copyProperties(trDevportVO, reportResultVo);
reportResultVo.setPortBandwidth(trDevportVO.getBandwidth());
BeanUtil.copyProperties(reportEsDTO, reportResultVo);
return reportResultVo;
})
.collect(Collectors.toList());
})
.map(resultVoList -> key + "@" + gatherTime, resultVoList))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
```
这样可以减少循环次数,提高代码效率。
阅读全文