Java 中,可以使用 stream() 方法对 Map<String, List<String>> 中的值进行求和。对于一个 Map<String, List<String>> 类型的 Map,如果 List 中的元素是数值型的字符串,那么我们可以对每个 List 进行求和。但 Java 的 List 中并没有直接的求和方法,需要我们进行一些转换和操作。本文主要介绍Java中使用stream()将Map<String, List<String>>类型数据中key对应value值求和sum的方法代码。

1、使用forEach实现

通过遍历Map中的每个List<String>,将每个元素转换为整数并累加到累加器中。

import java.util.List;  
import java.util.Map;  
 
public class Main { 
    public static void main(String[] args) { 
        Map<String, List<String>> map = Map.of(  
            "key1", List.of("1",  "2", "3"), 
            "key2", List.of("4",  "5", "6") 
        ); 
 
        int sum = 0; 
        for (List<String> list : map.values())  { 
            for (String str : list) { 
                sum += Integer.parseInt(str);  
            } 
        } 
 
        System.out.println("Sum:  " + sum); // 输出: Sum: 21 
    } 
}

2、使用collect()实现

使用 stream()Collectors.toMap() 来计算每个产品和订单的分数总和。

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // 输入示例
        Map<String, List<String>> inputMap = new HashMap<>();
        inputMap.put("product", Arrays.asList("132377",
        "2123232", "312335678", "423432", "5215566"));
        inputMap.put("order", Arrays.asList("3174252",
        "1468453", "1264543", "35723112", "235775645"));

        // 计算每个列表的总分数
        Map<String, Double> finalResult = inputMap.entrySet()
            .stream()
            .collect(Collectors.toMap(
                Entry::getKey,
                e -> e.getValue()
                      .stream()
                      .mapToDouble(Main::computeScore)
                      .sum()
            ));

        // 输出结果
        System.out.println("Final Result: " + finalResult);
    }

    // 示例计算分数的方法
    private static double computeScore(String str) {
        // 在这里根据你的逻辑计算分数
        // 示例:将字符串转换为数字并取其平方根作为分数
        return Math.sqrt(Double.parseDouble(str));
    }
}

import java.util.*;
import java.util.Map.Entry;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // 示例输入数据
        Map<String, List<String>> inputMap = new HashMap<>();
        inputMap.put("product", Arrays.asList("132377",
        "2123232", "312335678", "423432", "5215566"));
        inputMap.put("order", Arrays.asList("3174252",
        "1468453", "1264543", "35723112", "235775645"));

        // 使用流操作进行分数计算和收集
        Map<String, Double> finalResult = inputMap.entrySet()
            .stream()
            .map(entry -> new AbstractMap.SimpleEntry<>(
                entry.getKey(),
                entry.getValue().stream()
                    .mapToDouble(Main::computeScore)
                    .sum()
            ))
            .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

        // 输出结果
        System.out.println("Final Result: " + finalResult);
    }

    // 示例分数计算方法
    private static double computeScore(String str) {
        // 假设:将字符串转换为数字并取平方根作为分数
        return Math.sqrt(Double.parseDouble(str));
    }
}        

3、使用mapToInt和sum

通过将List<String>中的每个元素转换为整数,然后使用mapToIntsum方法来求和。

import java.util.List;  
import java.util.Map;  
 
public class Main { 
    public static void main(String[] args) { 
        Map<String, List<String>> map = Map.of(  
            "key1", List.of("1",  "2", "3"), 
            "key2", List.of("4",  "5", "6") 
        ); 
 
        int sum = map.values().stream()  
            .flatMap(List::stream) 
            .mapToInt(Integer::parseInt) 
            .sum(); 
 
        System.out.println("Sum:  " + sum); // 输出: Sum: 21 
    } 
} 

4、使用reduce

通过将List<String>中的每个元素转换为整数,然后使用reduce方法来求和。

import java.util.List;  
import java.util.Map;  
 
public class Main { 
    public static void main(String[] args) { 
        Map<String, List<String>> map = Map.of(  
            "key1", List.of("1",  "2", "3"), 
            "key2", List.of("4",  "5", "6") 
        ); 
 
        int sum = map.values().stream()  
            .flatMap(List::stream) 
            .map(Integer::parseInt) 
            .reduce(0, Integer::sum); 
 
        System.out.println("Sum:  " + sum); // 输出: Sum: 21 
    } 
} 

推荐文档