我有一个实体
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
但我不知道如何转换地图
理想的结果是“莫斯科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
注意:由于映射是无序的,基于总和、附加报告等,元素的顺序可能在每次运行时不一致。
我不知道你的地图是按原样还是按某种方式来获得结果,但你也可以这样做。
Map<String, Map<String, BigDecimal>> map =
list.stream()
.collect(Collectors.groupingBy(
Report::getDepartmentName,
Collectors.toMap(Report::getCurrency,
Report::getAmount, BigDecimal::add)));
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