Java 8里面的流对象真好用,函数式编程让编码不一样,并且还能并发执行。这里给出一个业务中实际遇到的数据查询映射成一个奇特的Map映射
{
table1: [
{
name1: "",
name2: ""
},
{
name1: "",
name2: ""
}
],
table2: [
{
name3: "1",
name4: "2"
},
{
name3: "3",
name4: "4"
}
]
}
如果使用普通的操作分别查询出table内的数据行得到List<table1Entity> lists
然后Map.put("table1",lists)
就完成了,但是这对于表多的话重复代码就变多了,不符合代码重用的思想。这里给出一个解决方法:
使用 Java8 的stream API可以较为高效的并发操作,不过理解起来有点难度,(调试也需要一点技巧?)
首先新建一个key的列表List<String> names
, 由其生成一个stream放入查询接口进行查询,得到另一个流,使用一个map进行映射出Javabean,利用filter删除为空的结果,最后Collectors.toList() 收集流。此时得到的是table1、table2的键值对数组([{"name1":"","name2":""}]
)。下面给他们按类别扔进对应的Key(由于没有统一基类故使用反射API调用其类型函数,返回类别),Collectors.toMap(s->{s.get(0).getClass().getMethod("getItemType").invoke(s)},s->s)
。附一张图参考,可能还需要进一步优化,不过肯定比线性查询出来后一行一行来的快(见灰色注释掉的代码)