lambda groupingBy Object返回复杂的JSON

时间:2017-01-15 07:02:36

标签: java json lambda java-8 slamdata

最近开始在Java中使用lambda。

Map<Category, Double> lMap = rptData.stream().collect(Collectors.groupingBy(Expense::getCategory,
            Collectors.summingDouble(j -> j.getFltAmt().doubleValue())));

上面的代码返回map,它将休息服务的放置作为JSON返回。

{"Category(intCatId=10013, strCatName=Home Maint)":4134.99,"Category(intCatId=10019, strCatName=Lease Breakage)":2600.0,"Category(intCatId=10011, strCatName=Utility Bill)":2067.76,"Category(intCatId=10010, strCatName=Fuel)":1018.77,"Category(intCatId=10012, strCatName=Entertainment)":192.4,"Category(intCatId=6, strCatName=Shopping)":1528.25,"Category(intCatId=4, strCatName=Medicine)":128.55,"Category(intCatId=10021, strCatName=Interest)":24.61,"Category(intCatId=3, strCatName=Phone)":539.09,"Category(intCatId=10020, strCatName=Movers)":1350.0,"Category(intCatId=5, strCatName=Grocery)":3519.83,"Category(intCatId=8, strCatName=School)":311.0,"Category(intCatId=10009, strCatName=Insurance)":1117.75,"Category(intCatId=7, strCatName=Eating Out)":614.22,"Category(intCatId=1, strCatName=Vehicle)":2843.58,"Category(intCatId=10018, strCatName=Courier)":22.65,"Category(intCatId=2, strCatName=Rent)":16506.95,"TotCount":13.0,"Category(intCatId=10017, strCatName=Travel)":800.42,"Category(intCatId=10015, strCatName=Donation)":326.0}

在上面的JSON中,我将整个Category作为map中的键,而不是我正在寻找intCatId。所以输出就像

{"10013":4134.99,"10019":...}

有什么办法吗?

示例:

费用{ Double fltAmt 日期dtDate (公式&#34;月(dtDate) - 年(dtDate)&#34;) 字符串monthYear (由intCatId加入) 类别类别 ... }

类别{ int intCatId String CatName ... }

我希望按月份获得(按类别和月份年份计算的所有费用金额的总和)。

在上面的例子中,rptData是带有sum(fltAmt),monthYear和Category的List。

2 个答案:

答案 0 :(得分:1)

根据Shamseer评论编辑

你几乎做到了。

您只需要将Map<Category, Double>更改为Map<Integer, Double>,然后在分组函数中,将Expense::getCategory替换为另一个lambda e -> e.getCategory().getIntCatId()(intCatId有一个getter,右?)

这将产生以下输出:

  

{10013:4134.99,10019:...}

答案 1 :(得分:0)

由于您的地图包含密钥作为Category对象,因此您输出的JSON中存在相同的内容,因为您使用的序列化程序正在将Category对象转换为JSON ......

您可以做的是为类别对象编写一个自定义序列化程序,它将类别ID作为相应的JSON值返回.....将需要有关您正在使用的序列化程序的更多详细信息,以进一步说明如何创建自定义序列化程序

或者另一种方法是更改​​地图类型并使用CategoryId(字符串类型)作为键....