首页 > 解决方案 > 将相同元素连接成一个元素的 Java 函数式方法

问题描述

我想使用 Streams API 来处理通话记录并计算同一电话号码的总账单金额。这是使用混合方法实现它的代码,但我想使用全功能方法:

List<CallLog> callLogs = Arrays.stream(S.split("\n"))
                    .map(CallLog::new)
                    .sorted(Comparator.comparingInt(callLog -> callLog.phoneNumber))
                    .collect(Collectors.toList());

            for (int i = 0; i< callLogs.size() -1 ;i++) {
                if (callLogs.get(i).phoneNumber == callLogs.get(i+1).phoneNumber) {
                    callLogs.get(i).billing += callLogs.get(i+1).billing;
                    callLogs.remove(i+1);
                }
            }

标签: javafunctional-programmingjava-stream

解决方案


您可以使用Collectors.groupingByCallLog按电话号码对对象进行分组,并使用Collectors.summingInt对分组元素的计费进行汇总

Map<Integer, Integer> likesPerType = Arrays.stream(S.split("\n"))
                                           .map(CallLog::new)
                 .collect(Collectors.groupingBy(CallLog::getPhoneNumber, Collectors.summingInt(CallLog::getBilling)));

推荐阅读