jdk8 stream流式处理替换for循环

1、for循环

        int size = chargeInfos.size();
        for (int i = 0; i < size; i++) {
            ChargeInfo chargeInfo = chargeInfos.get(i);
            String deviceNumber = chargeInfo.getDeviceNumber();
            String connectorId = chargeInfo.getConnectorId();

            // 2.1 按桩号分类端口
            if (!keyMap.containsKey(deviceNumber)) {
                List<String> conList = new ArrayList<>();
                conList.add(connectorId);
                keyMap.put(deviceNumber, conList);
            } else {
                List<String> conList = keyMap.get(deviceNumber);
                if (!conList.contains(connectorId)) {
                    conList.add(connectorId);
                }
                keyMap.put(deviceNumber, conList);
            }

            // 2.2 按桩号分类数据
            String info = stringRedisTemplate.opsForValue().get(deviceNumber);
            List<ChargeInfo> lists = null;
            if (info != null) {
                lists = JsonUtil.json2List(info, ChargeInfo.class);
            }
            if (lists == null) {
                lists = new ArrayList<>();
            }
            lists.add(chargeInfo);
            stringRedisTemplate.opsForValue().set(deviceNumber, JsonUtil.list2Json(lists)); // 每个桩号对应10分钟内上报的数据集合
            System.out.println("i=" + i);
        }

 

2、stream流处理,静态方式Stream.iterate()创建无限流

        Map<String, List<String>> keyMap = new HashMap<>();
        Stream.iterate(0, i -> i + 1).limit(chargeInfos.size()).forEach(i -> { // stream流式处理
            ChargeInfo chargeInfo = chargeInfos.get(i);
            String deviceNumber = chargeInfo.getDeviceNumber();
            String connectorId = chargeInfo.getConnectorId();

            // 2.1 按桩号分类端口
            if (!keyMap.containsKey(deviceNumber)) {
                List<String> conList = new ArrayList<>();
                conList.add(connectorId);
                keyMap.put(deviceNumber, conList);
            } else {
                List<String> conList = keyMap.get(deviceNumber);
                if (!conList.contains(connectorId)) {
                    conList.add(connectorId);
                }
                keyMap.put(deviceNumber, conList);
            }

            // 2.2 按桩号分类数据
            String info = stringRedisTemplate.opsForValue().get(deviceNumber);
            List<ChargeInfo> list = null;
            if (info != null) {
                list = JsonUtil.json2List(info, ChargeInfo.class);
            }
            if (list == null) {
                list = new ArrayList<>();
            }
            list.add(chargeInfo);
            stringRedisTemplate.opsForValue().set(deviceNumber, JsonUtil.list2Json(list)); // 每个桩号对应10分钟内上报的数据集合
            list.clear();
            System.out.println("i=" + i);
        });
        chargeInfos.clear();

 

3、并行流式处理

        chargeInfos.parallelStream().forEach(chargeInfo -> {
            String deviceNumber = chargeInfo.getDeviceNumber();
            String connectorId = chargeInfo.getConnectorId();

            // 2.1 按桩号分类端口
            if (!keyMap.containsKey(deviceNumber)) {
                List<String> conList = new ArrayList<>();
                conList.add(connectorId);
                keyMap.put(deviceNumber, conList);
            } else {
                List<String> conList = keyMap.get(deviceNumber);
                if (!conList.contains(connectorId)) {
                    conList.add(connectorId);
                }
                keyMap.put(deviceNumber, conList);
            }

            // 2.2 按桩号分类数据
            List<ChargeInfo> list = map.get(deviceNumber);
            if (list == null) {
                list = new ArrayList<>(10000);
            }
            list.add(chargeInfo);
            map.put(deviceNumber, list); // 每个桩号对应10分钟内上报的数据集合
        });
        log.info("数据量={}", chargeInfos.size());
        chargeInfos.clear();

实际批任务处理测试中,流式处理比for高效很多,数据量越大差距越明显,实际测试中5000条数据维持在100ms左右

JDK8中,引入了Stream API,这个API提供了一种更加简洁,高效的方式来处理数据的流式操作,Stream API支持对数据流进行过滤、映射、排序、聚合等多种操作。对于双重循环的情况,JDK8的Stream提供了三种方式:flatMap、forEach和reduce。 1. flatMap:flatMap操作可以将一个Stream中的每个元素转换成另一个Stream,然后将所有Stream合并成一个。在处理双重循环的情况下,我们可以使用flatMap将两个Stream合并成一个,然后对结果进行处理。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); List<int[]> result = list1.stream() .flatMap(i -> list2.stream() .map(j -> new int[]{i, j})) .collect(Collectors.toList()); result.forEach(arr -> System.out.println(Arrays.toString(arr))); ``` 2. forEach:forEach操作可以对Stream中的每个元素执行指定的操作。我们可以在forEach中嵌套一层循环处理双重循环的情况。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); list1.forEach(i -> { list2.forEach(j -> { int[] arr = new int[]{i, j}; System.out.println(Arrays.toString(arr)); }); }); ``` 3. reduce:reduce操作可以将Stream中的元素通过指定的操作进行合并,返回一个Optional类型的结果。我们可以在reduce中嵌套一层循环处理双重循环的情况。示例代码如下: ``` List<Integer> list1 = Arrays.asList(1, 2, 3); List<Integer> list2 = Arrays.asList(3, 4); List<int[]> result = list1.stream() .reduce(new ArrayList<>(), (acc, i) -> { list2.forEach(j -> acc.add(new int[]{i, j})); return acc; }, (l1, l2) -> {l1.addAll(l2); return l1;}); result.forEach(arr -> System.out.println(Arrays.toString(arr))); ``` 总之,在JDK8中处理双重循环可以使用flatMap、forEach和reduce等操作来实现,这些操作让Java代码变得更加简洁、高效、易于理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值