Total Pageviews

2015/01/31

2015/01 Travel

十分

十分瀑布


十分靜安吊橋

十分老街

台北孔廟

2015/01/23

How to Pixelate an Image in PicPick

Pixelation effect essentially lowers the definition of images, while increasing the size of the individual pixels, or dots, that make up images.  

If you need to pixelate your image, you can try PicPick and it's free.

Step1. Open the existing file in PicPick

Step2. Click Choose

Step3. Choose the area you would like to do pixelate

Step4. Click on the "Effects" button and then select the "Pixelate"option from the drop-down menu that appears. 



Step5. In the "Pixelate" menu, drag the "Pixelate" slider to the right to add and increase the amount of pixelation applied to your image. Then click OK.
Check the result:


















Reference
[1] http://www.picpick.org/en/features
[2] http://www.ehow.com/how_7307828_pixelate-image-using-photoshop.html

2015/01/16

如何看懂財務報表

如果說一張照片勝過千言萬語,對企業來說,數字也有相同功效。

以下的資產負債表中的資產部的份可以看到,結至2014 Q3為止,東鋼這家公司,手上現金約有11.78億,其他的資產包含應收帳款、廠房及設備、投資等等,目前手上資產共有377.5億


以下是東鋼這家公司負債的狀況,這個部分是公司的負債,包含應付帳款(如供應商的貸款、電話費, etc.)等等,結至2014 Q3為止,負債總額共151億






股東權益的部分,就是總負債、投入資本和保留盈餘的總和。
  • 保留盈餘(即下圖太過簡化,可以參考此 link 中67.61億的地方:http://goodinfo.tw/stockinfo/StockFinDetail.asp?RPT_CAT=BS_M_QUAR&STOCK_ID=2006),意思是公司把這筆錢留在公司,以便有額外的錢可以投資、做研發,讓公司成長。
  • 股東權益總額 = 資產 - 負債,即377.5 - 151 = 226.5  (億)
  • 每股淨值 = 股東權益總額 / 普通股股本 = 226.5 / 99.82 = 22.69 (尾數有差異,目前我不知道為什麼)


以下的損益表可以告訴我們,這家企業賺了多少錢、錢花到哪裡去,這家公司本益比是多少
  • 營業毛利 = 收入減去成本 = 85.02 - 79.14 = 5.88 (億)
  • 營業過程還會產生一些管理費用,所以營業利益 = 營業毛利減去營業費用 = 5.88 - 4.19 = 1.69  (億)
  • 每家公司都會有其業外的投資,例如2014Q3的業外收入有3.9,故其稅前淨利 = 營業利益 + 業外損益 = 1.69 + 2.23 - 0.58 = 3.34  (億)
  • 企業每年都要繳稅金給政府,故減去稅金以後,可以得到稅後盈餘 2.87  (億)
  • 本益比 = 股價除以每股稅後盈餘



現金流量表協助你追蹤前錢一個地方移往另外一個地方
  • 營業活動現金為正數,代表有賺錢,金額越多代表財力越好,不需要借錢周轉,財務較為穩健
  • 投資活動現金,是針對公司因生製及售賣貨物而購買的固定資產,以及變賣任何公司不再需要的固定資產,如變賣祖產是流入、購買廠房是流出。若是營業活動現金是負的,但是投資活動現金是正的,代表目前賺的錢不是本業在賺錢,是本業外收入,這時就要注意這家公司的狀況
  • 理財活動現金流量,包括從投資者如銀行及股東投入的現金,以及當企業把收入回饋投資者的現金流出。
    • 向銀行借錢,公司就產生正的現金流量;
    • 如果公司實施庫藏股,由於現金流出到外部股東的手中,現金流量就是負數
    • 發放現金股利,使得公司現金流出,現金流量表是負數
    • 現金增資,是向股東要錢流入公司
  • 應現金流量 = 營業 + 投資 + 理財
  • 期末現金流量是指該季結束時能夠收回的現金流量,算法是 期初現金流量 + 淨現金流量 = 3609.82 + (-2431.97)
  • 自由現金流量(Free cash flow, FCF),是可自由運用的現金流,是從營運來的現金流量扣減維持現有營運所需的資本支出和稅金後之餘額。企業可以用這些現金為公司的成長擴充,也可以作為發放股東股利,清償負債或是預留下來備度過景氣蕭條期。總之,自由現金流量是公司在不影響營運下可以自由使用的現金餘額,也是衡量公司財務彈性的指標


Reference

2015/01/08

[基金] 已撤銷核備是什麼意思?

今天登入到網路銀行的時候,發現之前買的基金突然被備註為" 已撤銷核備 "

基金下方說明,「已撤銷核備」為在台灣已下架(停售)的基金,往後不能單筆申購此筆基金,若是之前有設定定期定額的話,則可以繼續購買扣款,但是不能再往上調高金額。















看了網路上的一些說法,一檔基金下架(停售)有可能幾個原因
  1. 投資大陸的比重過重 (據說大部分是這個原因)
  2. 國內投資人比重超過九成,變成所謂國內基金
  3. 基金公司為了維持最適的操作規模,自行宣布停售

但是看了環球發現的公開說明書,在中國大陸的比重是0,所以第一點不成立



















國內投資人比重2.79%,所以第二點也不成立
















終於最後找到新聞 "根據摩根給各通路公文上表示,「量太少已不具在台灣註冊之商業可行性考量」,因此將在103年12月31日撤銷在台灣銷售以及募集"

原來是太少人買了,只是不知道下架後會有什麼影響,就先繼續觀察了

Reference
[1] http://blog.xuite.net/blacktin/wretch/129375026-%E5%9F%BA%E9%87%91%E6%A8%99%E7%A4%BA%E3%80%8C%E5%B7%B2%E6%92%A4%E9%8A%B7%E6%A0%B8%E5%82%99%E3%80%8D
[2] https://www.ptt.cc/bbs/CFP/M.1234665668.A.96A.html
[3] http://www.chinatimes.com/newspapers/20141205000282-260208

How to do Conditional Control in Stored Procedure

There are three input parameters for this stored procedure
  • INPUT_YEAR: ex. 103 (ROC era system)
  • INPUT_QUARTER: ex. 4 means quarter 4
  • INPUT_USER_ID: login user id
This procedure will execute different part based on different quarter.
We can use IF-THEN-ELSIF to fulfill this requirement.

The syntax for IF-THEN-ELSIF is :
IF condition1 THEN
   {...statements to execute when condition1 is TRUE...}

ELSIF condition2 THEN
   {...statements to execute when condition2 is TRUE...}

ELSE
   {...statements to execute when both condition1 and condition2 are FALSE...}

END IF;

Example:
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
create or replace PROCEDURE PROC_FMS406R_TAB6_FCST_VALUES 
(
  INPUT_YEAR IN VARCHAR2 
, INPUT_QUARTER IN VARCHAR2 
, INPUT_USER_ID IN VARCHAR2 
) AS 
BEGIN
  NULL;
  IF INPUT_QUARTER = '1' THEN
    dbms_output.put_line('Q1');
    --1.2.9 撈出本年度收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表
    --1.2.9.1 當前端選擇第一季(本年度1~3月都是預估數)
    MERGE INTO FMS406FI T1
    USING
    (
      SELECT YYY_MM, ALC1, ALC2, ALC3
      FROM
      (
        SELECT *
        FROM FMS406FG
        WHERE SEQ = 2 AND (YYY_MM BETWEEN INPUT_YEAR||'01' AND INPUT_YEAR||'03')
        ORDER BY YYY_MM DESC
      )
      WHERE ROWNUM = 1
    ) T2
    ON (T1.YEAR = INPUT_YEAR AND T1.TYPE='1' AND T1.QUARTER = INPUT_QUARTER)
    WHEN MATCHED THEN UPDATE 
    SET T1.AMT1 = T2.ALC1, T1.AMT2 = T2.ALC2, T1.AMT3 = T2.ALC3
    ;
    dbms_output.put_line('execute 1.2.9 撈出本年度第一季收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表');
   
  ELSIF  INPUT_QUARTER = '2' THEN
    dbms_output.put_line('Q2');
    --1.2.9 撈出本年度收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表
    --1.2.9.2 當前端選擇第二季 (本年度4~6月都是預估數)
    MERGE INTO FMS406FI T1
    USING
    (
      SELECT YYY_MM, ALC4, ALC5, ALC6
      FROM
      (
        SELECT *
        FROM FMS406FG
        WHERE SEQ = 2 AND (YYY_MM BETWEEN INPUT_YEAR||'01' AND INPUT_YEAR||'06')
        ORDER BY YYY_MM DESC
      )
      WHERE ROWNUM = 1
    ) T2
    ON (T1.YEAR = INPUT_YEAR AND T1.TYPE='1' AND T1.QUARTER = INPUT_QUARTER)
    WHEN MATCHED THEN UPDATE 
    SET T1.AMT4 = T2.ALC4, T1.AMT5 = T2.ALC5, T1.AMT6 = T2.ALC6
    ;
    dbms_output.put_line('execute 1.2.9 撈出本年度第二季收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表');
        
  ELSIF  INPUT_QUARTER = '3' THEN
    dbms_output.put_line('Q3');
    --1.2.9 撈出本年度收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表
    --1.2.9.3 當前端選擇第三季 (本年度7~9月都是預估數)
    MERGE INTO FMS406FI T1
    USING
    (
      SELECT YYY_MM, ALC7, ALC8, ALC9
      FROM
      (
        SELECT *
        FROM FMS406FG
        WHERE SEQ = 2 AND (YYY_MM BETWEEN INPUT_YEAR||'01' AND INPUT_YEAR||'09')
        ORDER BY YYY_MM DESC
      )
      WHERE ROWNUM = 1
    ) T2
    ON (T1.YEAR = INPUT_YEAR AND T1.TYPE='1' AND T1.QUARTER = INPUT_QUARTER)
    WHEN MATCHED THEN UPDATE 
    SET T1.AMT7 = T2.ALC7, T1.AMT8 = T2.ALC8, T1.AMT9 = T2.ALC9
    ;
    dbms_output.put_line('execute 1.2.9 撈出本年度第三季收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表');
        
  ELSIF  INPUT_QUARTER = '4' THEN
    dbms_output.put_line('Q4');
    --1.2.9 撈出本年度收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表
    --1.2.9.4 當前端選擇第四季 (本年度10~12月都是預估數)
    MERGE INTO FMS406FI T1
    USING
    (
      SELECT YYY_MM, ALC10, ALC11, ALC12
      FROM
      (
        SELECT *
        FROM FMS406FG
        WHERE SEQ = 2 AND (YYY_MM BETWEEN INPUT_YEAR||'01' AND INPUT_YEAR||'12')
        ORDER BY YYY_MM DESC
        )
        WHERE ROWNUM = 1
    ) T2
    ON (T1.YEAR = INPUT_YEAR AND T1.TYPE='1' AND T1.QUARTER = INPUT_QUARTER)
    WHEN MATCHED THEN UPDATE 
    SET T1.AMT10 = T2.ALC10, T1.AMT11 = T2.ALC11, T1.AMT12 = T2.ALC12
    ;
    dbms_output.put_line('execute 1.2.9 撈出本年度第四季 收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表');
    
  END IF;
  
END PROC_FMS406R_TAB6_FCST_VALUES;

Assume I assign these values into three parameters:
  • INPUT_YEAR: 103
  • INPUT_QUARTER: 4
  • INPUT_USER_ID: ALBERT
The stored procedure will execute this section
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  ELSIF  INPUT_QUARTER = '4' THEN
    dbms_output.put_line('Q4');
    --1.2.9 撈出本年度收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表
    --1.2.9.4 當前端選擇第四季 (本年度10~12月都是預估數)
    MERGE INTO FMS406FI T1
    USING
    (
      SELECT YYY_MM, ALC10, ALC11, ALC12
      FROM
      (
        SELECT *
        FROM FMS406FG
        WHERE SEQ = 2 AND (YYY_MM BETWEEN INPUT_YEAR||'01' AND INPUT_YEAR||'12')
        ORDER BY YYY_MM DESC
        )
        WHERE ROWNUM = 1
    ) T2
    ON (T1.YEAR = INPUT_YEAR AND T1.TYPE='1' AND T1.QUARTER = INPUT_QUARTER)
    WHEN MATCHED THEN UPDATE 
    SET T1.AMT10 = T2.ALC10, T1.AMT11 = T2.ALC11, T1.AMT12 = T2.ALC12
    ;
    dbms_output.put_line('execute 1.2.9 撈出本年度第四季 收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表');
    
  END IF;


Execution result:
1
2
Q4
execute 1.2.9 撈出本年度第四季 收入數之預估數,寫入﹝FMS406FI﹞國庫現金收支估測分析表



Reference
[1] http://www.techonthenet.com/oracle/loops/if_then.php
[2] http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/controlstatements.htm#LNPLS386

How to get changes from master into branch via egit

Question
 I am working in getDebtSpaceData branch.















Assume the DebtTypeEnum had been updated in master branch
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package gov.nta.dbm.enumeration;

// TODO: Auto-generated Javadoc
/**
 * The Enum DebtTypeEnum.
 */
public enum DebtTypeEnum {

    /** The a. */
    A("A", "公債"),
    /** The b. */
    B("B", "國庫券"),
    /** The c. */
    C("C", "中長借"),
    /** The d. */
    D("D", "短借");

    private String code;
    private String name;

    private DebtTypeEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * Gets the code.
     * 
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * Gets the name.
     * 
     * @return the name
     */
    public String getName() {
        return name;
    }

}

Therefore, the DebtTypeEnum in getDebtSpaceData branch is out-of-date.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package gov.nta.dbm.enumeration;

// TODO: Auto-generated Javadoc
/**
 * The Enum DebtTypeEnum.
 */
public enum DebtTypeEnum {

    /** The a. */
    A("A", "公債"),
    /** The b. */
    B("B", ""),
    /** The c. */
    C("C", ""),
    /** The d. */
    D("D", "");

    private String code;
    private String name;

    private DebtTypeEnum(String code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * Gets the code.
     * 
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * Gets the name.
     * 
     * @return the name
     */
    public String getName() {
        return name;
    }

}

If I would like to pull up-to-date code from master branch and merge into getDebtSpaceData branch. How to do this?

Answer
Step1. Right click => Team => Merge
 Step2. Choose Master => Merge


Step3. Click OK


In getDebtSpaceData branch, we can see the content of DebtTypeEnum is up-to-date.

Reference

2015/01/01

[閱讀筆記] 綠角的基金八堂課


  1. 所謂的會投資,指的是不要冒不必要的風險,不要犯可以避免的錯誤就好了 
  2. 高波動(高風險)不一定有高報酬,高風險可能最後帶來的是高虧損  
  3. 投資的目的,不在於創造可以拿出來誇耀的成績,而是在於達成自己的財務目標  
  4. 高風險策略往往不是高報酬策略。畢竟,投資靠的不是敢冒險的衝動,而是懂得控制風險的謹慎  
  5. 不要自信滿滿地以為不會遇到壞事,那不是風險控制。要假設壞事有可能發生,但就算遇到,損失也因為事先採取了防範而被控制在一定範圍內,這才是風險管控  
  6. 分散投資要有兩種特性:廣泛持有(如買進共同基金或ETF)、成本低廉(包括金錢成本與時間成本)  
  7. 過去績效,對於未來績效幾乎沒有預測能力  
  8. 5050選基金法:基金總開銷比率(包含經理費、銀行保管費等)要在0.50%以下、基金年周轉率(即基金更換持股頻率)要在50%以下  
  9. 與其參考過去績效,投資人更應該留意基金的內扣成本。內扣成本越小的基金,未來越容易有好表現,這才是買基金最該注意的事情  
  10. 指數化投資教父John Clifton Bogle說:假如投資能指能靠一個標準來挑選未來表現優越的基金,避開未來績效不彰的基金,這個標準就是基金費用 
  11. 投資人有兩種,一是被動投資人,另一個則是主動投資人。因為被動投資人持有指數型基金,拿到的是市場報酬,然而主動投資人所拿到的,不多不少,也剛好是市場報酬 
  12. 巴菲特曾說:股市預測者的唯一價值,在於讓算命仙看起來更準一些 
  13. 彼得學林曾說:我也想要可以預測市場走向和事先知道景氣衰退,但是這是不可能的。我寧願和巴菲特一樣,尋找有獲利潛能的公司 
  14. 古希臘哲學家Democritus曾說:智者與笨蛋的差別在於,智者寄望他所能取得的,笨蛋在追求不可能的事情 
  15. 定期定額的目的,在於讓投資人將自己的資金看成一條水流,將資金分散在廣大帶狀的投入時點上,暴露在各種經濟環境中,避免整體資金遭逢單一時段不佳報酬的風險 
  16. 能拿出多少資本來投資、累積,才是真正決定最後終點價值多寡的決定要素 
  17. 定期定額有壓低平均買進成本的效用;定股投資可以確保投資人在長期上漲的走勢中持續買入、參與市場;定期定值則可讓投資人低點多買,高點少買甚至賣出,有機會將投資成本壓低 
  18. 投資的重點不僅是報酬率,最後累積金額的多寡,往往才是重點 
  19. 定期定額若沒有將投資金額跟隨著通膨與市長的成長同步調升,會造成投入市場的累積資金相對減低。定期定值在市場上漲時少買,甚至賣出的動作,一樣會造成投入資金減少的問題 
  20. 定期定額與定期定值都有可能因為通膨的關係,導致投入市場的資本減少,因此而降低了獲利的額度。解決方法,則是每隔一段期間,向上調整投資的額度 
  21. 停損停利要在可以預知未來市場走勢時,才會有效 
  22. 股票有較高的期望報酬,但它未必有較高的實際報酬。有時候回顧過去,我們會看到股票實現了他的風險,而不是他的期望報酬  
  23. 投資應是針對未來各種不同的經濟狀況做準備。不同的資產類別有不同的作用:景氣好的時候,股票讓你參與經濟成長;通貨緊縮時,現金有保值效果;通膨時,抗通膨債券可以維持你的購買力;金融動盪之際,高評等公債金發揮保護的效果 
  24. 不是去臆測未來的經濟發展才是投資專業,替未來的各種可能做好準備,才是務實之策 
  25. 資產配置的重點在於處理未來不確定結果的風險,這是投資的要義  
  26. 資產配置的目的,不在於讓投資人壓寶,看能否買種未來爆發大漲的市場,而是讓投資人的投資組合可以適應不同的狀況,在各種不同的場景下,都還能有還不錯的表現  
  27. 大多投資人只注意上漲可以賺多少,其實擴大報酬率的要訣之一,在於少賠。也就是說,假如能限縮投資組合虧錢的幅度,你就可以擴大賺錢的機會 
  28. 投資人該問自己的問題,不是假如股市重挫時,自己是否有準備,而是當股市重挫時,自己是否準備好了 
  29. 將投資組合中納入低風險資產,首要原因是為了控制下跌幅度,讓投資人更有機會安然度過熊市,並更容易從較淺的受挫中復原 
  30. 低風險資產可以確保投資組合的價值穩定性,當用錢的時刻逐漸靠近,投資人可以確信手上的錢,不會在短時間內經歷大幅的減值 
  31. 高評等公債,可以在金融風暴之際,成為資金避風港,逆勢上漲,故低風險資產可以選用高評等公債 
  32. 公司債與高收益債不適合視為低風險資產,因為股市沉淪時,這兩種資產也無法倖免  


2014/12/31

2014/12 九州

Tenjin (天神) 街頭


太宰府天満宮 参道


太宰府天満宮


太宰府天満宮


Kōmyōzen-ji



Hakata Station


湯の坪街道


金鱗湖


一蘭 本社総本店


2014/12/25

Apache CollectionUtils 應用

Assume we had 2 list data
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
      //create a value object and add into list1
        UnpaymentDataVo vo1 = new UnpaymentDataVo();
        vo1.setDebtType("B");
        vo1.setBudgetCode(new BigDecimal(1));
        vo1.setDebitName("總預算");
        vo1.setDamt(new BigDecimal(5156340000000L));
        vo1.setCamt(new BigDecimal(3489209150690L));
        vo1.setIamt(new BigDecimal(69360745739L));
        vo1.setRamt(new BigDecimal(1597620103571L));

        List<UnpaymentDataVo> list1 = new ArrayList<UnpaymentDataVo>();
        list1.add(vo1);

 //create 2 value objects and add into list2
        UnpaymentDataVo vo2 = new UnpaymentDataVo();
        vo2.setDebtType("A");
        vo2.setBudgetCode(new BigDecimal(2));
        vo2.setDebitName("易淹水地區水患治理計劃第2期特別預算");
        vo2.setDamt(new BigDecimal(7500000000L));
        vo2.setCamt(new BigDecimal(0));
        vo2.setIamt(new BigDecimal(637500000L));
        vo2.setRamt(new BigDecimal(7500000000L));

        UnpaymentDataVo vo3 = new UnpaymentDataVo();
        vo3.setDebtType("A");
        vo3.setBudgetCode(new BigDecimal(1));
        vo3.setDebitName("振興經濟擴大公共建設特別預算");
        vo3.setDamt(new BigDecimal(204400000000L));
        vo3.setCamt(new BigDecimal(0));
        vo3.setIamt(new BigDecimal(14465750000L));
        vo3.setRamt(new BigDecimal(204400000000L));

        List<UnpaymentDataVo> list2 = new ArrayList<UnpaymentDataVo>();
        list2.add(vo2);
        list2.add(vo3);

 //print list1 and list2
        log.debug("list1=" + list1.toString());
        log.debug("list2=" + list2.toString());

The data structure looks like this:
1
2
3
- list1=[UnpaymentDataVo(debtType=B, budgetCode=1, debitName=總預算, damt=5156340000000, camt=3489209150690, iamt=69360745739, ramt=1597620103571)]
- list2=[UnpaymentDataVo(debtType=A, budgetCode=2, debitName=易淹水地區水患治理計劃第2期特別預算, damt=7500000000, camt=0, iamt=637500000, ramt=7500000000), 
         UnpaymentDataVo(debtType=A, budgetCode=1, debitName=振興經濟擴大公共建設特別預算, damt=204400000000, camt=0, iamt=14465750000, ramt=204400000000)]


If you would like to find out the data from list2 which condition is debt_type='A' and budget_code=2
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        // find out the data from list2 which condition is debt_type='A' and budget_code=2
        List<UnpaymentDataVo> searchResult = new ArrayList<UnpaymentDataVo>();
        CollectionUtils.select(list2, new Predicate() {
            @Override
            public boolean evaluate(Object object) {
                UnpaymentDataVo vo = (UnpaymentDataVo) object;
                return "A".equals(vo.getDebtType())
                        && vo.getBudgetCode().compareTo(new BigDecimal(2)) == 0;
            }
        }, searchResult);

        log.debug("searchResult = " + searchResult.toString());

The search result looks like this:
1
2
- searchResult = [UnpaymentDataVo(debtType=A, budgetCode=2, debitName=易淹水地區水患治理計劃第2期特別預算, damt=7500000000, camt=0, iamt=637500000, ramt=7500000000), 
]

If you would like to get  a Collection containing the union of list1 and list2
1
2
3
4
        // Returns a Collection containing the union of the given Collections
        List<UnpaymentDataVo> unionResult = (List<UnpaymentDataVo>) CollectionUtils.union(list1,
                list2);
        log.debug("unionResult = " + unionResult.toString());

The union result looks like this:
1
2
3
- unionResult = [UnpaymentDataVo(debtType=A, budgetCode=2, debitName=易淹水地區水患治理計劃第2期特別預算, damt=7500000000, camt=0, iamt=637500000, ramt=7500000000), 
                 UnpaymentDataVo(debtType=A, budgetCode=1, debitName=振興經濟擴大公共建設特別預算, damt=204400000000, camt=0, iamt=14465750000, ramt=204400000000), 
   UnpaymentDataVo(debtType=B, budgetCode=1, debitName=總預算, damt=5156340000000, camt=3489209150690, iamt=69360745739, ramt=1597620103571)]


If you would like to return a collection which contains unionResult - list2
1
2
3
4
        // Returns a new Collection containing a - b.
        List<UnpaymentDataVo> subtractResult = (List<UnpaymentDataVo>) CollectionUtils.subtract(
                unionResult, list2);
        log.debug("subtractResult = " + subtractResult.toString());

The subtract result looks like this:
1
- subtractResult = [UnpaymentDataVo(debtType=B, budgetCode=1, debitName=總預算, damt=5156340000000, camt=3489209150690, iamt=69360745739, ramt=1597620103571)]



Reference
[1] https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/CollectionUtils.html#subtract(java.util.Collection, java.util.Collection)