java - 通过使用 java 8 流 API 比较 2 个 map 来计算百分比?

标签 java java-8 java-stream

我有两个带有 long 的 String 映射,我想通过将一个映射值与另一个映射值进行比较来计算百分比。

例如:

Map<String, Long> map1 = new ConcurrentHashMap<String, Long>();
map1.put("test1", (long) 20);
map1.put("test2", (long) 30);
Map<String, Long> map2 = new ConcurrentHashMap<String, Long>();
map2.put("test1", (long) 120);
map2.put("test2", (long) 120);

我想通过比较 map2 值和 map1 值来计算 test1 和 test2 值的平均值。

期望的结果应该是

resultmap = [test1 : "16.66%", test2 : "25%"]

最佳答案

像这样

private static String asPercent(long l1, long l2) {
    return String.format("%2.2f%%", ((float) l1 / l2 * 100));
}

final Map<String, String> percentMap = map1.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, entry -> asPercent(entry.getValue(), map2.get(entry.getKey()))));
System.out.println(percentMap);

这假设对于您在 map1 中的每个键,在 map2 中都有一个条目。

我的代码产生了 16.67% 而你想要 16.66%;如果您真的需要截断而不是更准确的(数学上的)舍入,您可能需要添加一些舍入代码。

关于java - 通过使用 java 8 流 API 比较 2 个 map 来计算百分比?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46758380/

相关文章:

java - java中两个日期的时间差

java - 解析 SAX 中的特殊字符(&lt、&gt ..etc)

java - 如何使用未知数量的比较器对列表/流进行排序?

Java .forEach(list::add) 与 .collect(Collectors.toList())

Java 8 流 : list to flat map grouped by

java - 如何在 JTable 上设置自定义顺序

java - 如何在Java中将一个模拟对象注入(inject)另一个模拟对象的模拟中?

java - 计算 Map 中具有 Set as 值的项目

java - 在 LocalDate 和 sql.Date 之间转换

java - Stream.reduce() 与 Stream.parallel.reduce()