Requirement
報表輸出結果,應該依序輸出「營業事業所得稅」、「綜合所得稅」、「遺產稅」、「贈與稅」、「貨物稅」、「菸酒稅」、「證券交易稅」、「期貨交易稅」、「營業稅」、「特銷稅」。如果沒有資料,該稅別要顯示出來,數字要顯示0。結果如下,
根據user requirement要求的輸出結果,並不是按照tax code或者tax name的筆劃順序進行排序,此部份必須要根據query回來的的結果來做加工。
Problem
原本的作法是用SQL將統計資訊算出來,但是其只會傳回有存在的資料,若沒有符合條件,就不會回傳資料,故只有回傳兩筆資料。
從SQL回傳回來的結果會是一個List of value object,以目前的條件,只會有兩個value object,分別是「營利事業所得稅」與「期貨交易稅」。
Solution
由於資料固定只有10筆,放在SQL裡頭做的話,SQL會很複雜,日後維護不易,故此部份的資料加工放在AP端進行處理。
- 建立一個新的List物件, List result = new ArrayList();
- 根據回傳回來的list of value object來進行判斷
- List中是否有「營業事業所得稅」的資料
- 若「有」,從List中找出該object,並add到新的List物件
- 若「無」,add一筆空的資料到新的List物件
- List中是否有「 綜合所得稅
」的資料
- 若「有」,從List中找出該object,並add到新的List物件
- 若「無」,add一筆空的資料到新的List物件
- List中是否有「 遺產稅
」的資料
- 若「有」,從List中找出該object,並add到新的List物件
- 若「無」,add一筆空的資料到新的List物件
- 「 贈與稅
」、「 貨物稅
」、「 菸酒稅
」、「 證券交易稅
」、「 期貨交易稅
」、「 營業稅
」、「 特銷稅
」依此類推
Apache Commons有提供CollectionsUtils此API,其提供不少utility method來針對Collection物件進行一些處理,根據以上需求有兩個:
- 從List中check是否有存在特定的object
- 從List中取得特定的object
//List中是否有「營業事業所得稅」的資料
1: private static boolean is35Exist(List list) {
2: return CollectionUtils.exists(list, new Predicate() {
3: @Override
4: public boolean evaluate(Object obj) {
5: NIG630ReportBean bean = (NIG630ReportBean) obj;
6: return "營利事業所得稅".equals(bean.getTaxNm());
7: }
8: });
9: }
//從List中找出該object
1: private static NIG630ReportBean find35(List list){
2: return (NIG630ReportBean) CollectionUtils.find(list, new Predicate() {
3: @Override
4: public boolean evaluate(Object obj) {
5: NIG630ReportBean bean = (NIG630ReportBean) obj;
6: return "營利事業所得稅".equals(bean.getTaxNm());
7: }
8: });
9: }