Java 8里面的流對(duì)象真好用管怠,函數(shù)式編程讓編碼不一樣,并且還能并發(fā)執(zhí)行劳殖。這里給出一個(gè)業(yè)務(wù)中實(shí)際遇到的數(shù)據(jù)查詢映射成一個(gè)奇特的Map映射
{
table1: [
{
name1: "",
name2: ""
},
{
name1: "",
name2: ""
}
],
table2: [
{
name3: "1",
name4: "2"
},
{
name3: "3",
name4: "4"
}
]
}
如果使用普通的操作分別查詢出table內(nèi)的數(shù)據(jù)行得到List<table1Entity> lists
然后Map.put("table1",lists)
就完成了摘完,但是這對(duì)于表多的話重復(fù)代碼就變多了,不符合代碼重用的思想爷绘。這里給出一個(gè)解決方法:
使用 Java8 的stream API可以較為高效的并發(fā)操作,不過(guò)理解起來(lái)有點(diǎn)難度进倍,(調(diào)試也需要一點(diǎn)技巧土至?)
首先新建一個(gè)key的列表List<String> names
, 由其生成一個(gè)stream放入查詢接口進(jìn)行查詢猾昆,得到另一個(gè)流陶因,使用一個(gè)map進(jìn)行映射出Javabean,利用filter刪除為空的結(jié)果垂蜗,最后Collectors.toList() 收集流楷扬。此時(shí)得到的是table1、table2的鍵值對(duì)數(shù)組([{"name1":"","name2":""}]
)贴见。下面給他們按類別扔進(jìn)對(duì)應(yīng)的Key(由于沒(méi)有統(tǒng)一基類故使用反射API調(diào)用其類型函數(shù)烘苹,返回類別),Collectors.toMap(s->{s.get(0).getClass().getMethod("getItemType").invoke(s)},s->s)
片部。附一張圖參考镣衡,可能還需要進(jìn)一步優(yōu)化,不過(guò)肯定比線性查詢出來(lái)后一行一行來(lái)的快(見(jiàn)灰色注釋掉的代碼)