当前位置: 首页 > 知识库问答 >
问题:

如何将Map转换为String?

晏修诚
2023-03-14

我有一个实体

public class Report {
    private String departmentName;
    private BigDecimal amount;
    private String currency;
}

我想根据货币计算每个部门的金额,并将结果写在行中。例子:

    List<Report> list = new ArrayList<>();
    list.add(new Report("Moscow", new BigDecimal(100), "USD"));
    list.add(new Report("Moscow", new BigDecimal(100), "USD"));
    list.add(new Report("Paris", new BigDecimal(100), "USD"));
    list.add(new Report("Moscow", new BigDecimal(200), "RUR"));

结果:“莫斯科200美元,巴黎100美元,莫斯科200卢布”

对于it:

Map<String, Map<String, String>> collect = list.stream().collect(
            Collectors.groupingBy(doc -> doc.getDepartmentName(),
                    Collectors.groupingBy(Report::getCurrency,
                            Collectors.collectingAndThen(Collectors.toList(), doc -> {
                                BigDecimal sum = doc.stream()
                                        .map(A::getAmount)
                                        .filter(Objects::nonNull)
                                        .reduce(BigDecimal.ZERO, BigDecimal::add);

                                String cur = doc.stream().map(Report::getCurrency)
                                        .findFirst().get();
                                return sum.toString() + " " + cur;
                            }))));

我收到一个结果:

{Paris={USD=100 USD}, Moscow={USD=200 USD, RUR= 200 RUR}} -- correct

但我不知道如何转换地图

共有1个答案

漆雕令秋
2023-03-14

理想的结果是“莫斯科200美元,巴黎100美元,莫斯科200卢布”使用flatMap像这样尝试。

  • 流式处理主地图的入口集
String result = map.entrySet().stream()
        .flatMap(e -> e.getValue().entrySet().stream()
                .map(e2 -> e.getKey() + " " + e2.getValue()))
        .collect(Collectors.joining(", "));
System.out.println(result);

印刷品

Paris 100 USD, Moscow 200 RUR, Moscow 200 USD

注意:由于映射是无序的,基于总和、附加报告等,元素的顺序可能在每次运行时不一致。

我不知道你的地图是按原样还是按某种方式来获得结果,但你也可以这样做。

  • 像以前一样使用groupingBy,但使用toMap作为收集器
Map<String, Map<String, BigDecimal>> map =
        list.stream()
                .collect(Collectors.groupingBy(
                        Report::getDepartmentName,
                        Collectors.toMap(Report::getCurrency,
                                Report::getAmount, BigDecimal::add)));
  • 然后,您将执行与之前类似的操作,但在此处将bigdecim转换为字符串,并将货币类型(e2.getKey())附加到该字符串中
String result = map1.entrySet().stream().flatMap(e -> e
                .getValue().entrySet().stream()
                .map(e2 -> e.getKey() + " " + e2.getValue().toString()
                        + " " + e2.getKey()))
                .collect(Collectors.joining(", "));
 类似资料:
  • 考虑到类有三个字段name(String)、age(int)、salary(double)。 我想创建一个名为键,值为工资的映射(而不是对象本身),如果键不唯一,则使用linkedList保存所有重复键的值。 如何实现这种场景?

  • 我在一个类中有以下代码,它扩展了Primefaces的 在上面的过滤器是类型

  • 问题内容: 我有一些要转换成的属性 我可以从json.org或使用什么吗? 问题答案: 使用来自http://json.org/的 Jackson(http://jackson.codehaus.org/)

  • 问题内容: 像这样转换JSON代码的最佳方法是什么: 在Java Map中,其中一个键为(field1,field2),而这些字段的值为(value1,value2)。 有任何想法吗?我应该使用Json-lib吗?或者,如果我编写自己的解析器会更好? 问题答案: 我希望您在开玩笑编写自己的解析器。:-) 对于这种简单的映射,http://json.org(java部分)中的大多数工具都可以使用。对

  • 我有一个,并希望该流的每个元素都进行一些计算并将它们返回为,其中键是int值,值是该计算的结果。我写了以下一段代码: 其中,计算第m个(整数a)。我发现下一个编译器错误 我做错了什么?

  • 问题内容: 从来源来看,我无法影响我在地图中获得的数据,该地图以表示。 我需要处理所包含的数据,最好是(其中的数据非常适合该处理)。 我还需要从数据中生成键列表,因为这些键是事先未知的。 我可以在网上找到的大多数类似问题或多或少都说这是不可能的,但是如果我的地图是,则表明数据在那里,可读性为。 我该怎么办fmt.Println可以做什么? 问题答案: 处理未知接口的一种安全方法,只需使用fmt.S