这是我上一个问题的继续
Group, Sum byType then get diff using Java streams
。
正如建议的那样,我应该作为一个单独的线程发布,而不是更新原来的线程。
因此,通过我之前的一系列问题,我已经做到了这一点,现在,通过继续。
背景:
我有以下数据集
Sample(SampleId=1, SampleTypeId=1, SampleQuantity=5, SampleType=ADD),
Sample(SampleId=2, SampleTypeId=1, SampleQuantity=15, SampleType=ADD),
Sample(SampleId=3, SampleTypeId=1, SampleQuantity=25, SampleType=ADD),
Sample(SampleId=4, SampleTypeId=1, SampleQuantity=5, SampleType=SUBTRACT),
Sample(SampleId=5, SampleTypeId=1, SampleQuantity=25, SampleType=SUBTRACT)
Sample(SampleId=6, SampleTypeId=2, SampleQuantity=10, SampleType=ADD),
Sample(SampleId=7, SampleTypeId=2, SampleQuantity=20, SampleType=ADD),
Sample(SampleId=8, SampleTypeId=2, SampleQuantity=30, SampleType=ADD),
Sample(SampleId=9, SampleTypeId=2, SampleQuantity=15, SampleType=SUBTRACT),
Sample(SampleId=10, SampleTypeId=2, SampleQuantity=35, SampleType=SUBTRACT)
我目前正在使用:
sampleList.stream()
.collect(Collectors.groupingBy(Sample::getTypeId,
Collectors.summingInt(
sample -> SampleType.ADD.equalsIgnoreCase(sample.getSampleType())
? sample.getSampleQuantity() :
-sample.getSampleQuantity()
)));
还有这个
sampleList.stream()
.collect(Collectors.groupingBy(Sample::getSampleTypeId,
Collectors.collectingAndThen(
Collectors.groupingBy(Sample::getSampleType,
Collectors.summingInt(Sample::getSampleQuantity)),
map -> map.getOrDefault(SampleType.ADD, 0)
- map.getOrDefault(SampleType.SUBTRACT, 0))));
作为可接受的答案,以在
Map<Long, Integer>
:
{1=15, 2=10}
有了这些,我想知道,这是否可以扩展到其他方面。
首先,我怎样才能让它作为
Map<String, Integer>
而不是原来的
地图<长整数(&T);
。基本上,对于SampleTypeId;1表示你好,2表示世界。
所以我需要一个
.map
(或者其他函数)通过调用函数say将数据从1转换为HELLO,从2转换为WORLD
convertType(sampleTypeId)
?。因此,预期输出将是
{"HELLO"=15, "WORLD"=10}
。是这样吗?我应该如何编辑此问题的当前建议解决方案?
最后,我想知道是否也可以将其返回到对象而不是
Map
。假设我有一个目标;
SummaryResult with (String) name and (int) result
。所以它返回一个
List<SummaryResult>
而不是原来的
地图<长整数(&T);
。如何使用
。地图
(或其他)功能来执行此操作?还是有其他方法可以做到这一点?预期的输出将是沿着这条线的东西。
SummaryResult(name="hello", result=15),
SummaryResult(name="world", result=10),
非常感谢@M.Prokhorov之前给出的步骤解释。
更新时间:
更新到后
sampleList.stream()
.collect(Collectors.groupingBy(sample -> convertType(sample.getSampleTypeId()),
Collectors.collectingAndThen(
Collectors.groupingBy(Sample::getSampleType,
Collectors.summingInt(Sample::getSampleQuantity)),
map -> map.getOrDefault(SampleType.ADD, 0)
- map.getOrDefault(SampleType.SUBTRACT, 0))));
private String convertType(int id) {
return (id == 1) ? "HELLO" : "WORLD";
}