發表文章

目前顯示的是有「java」標籤的文章

寫給大忙人看的Java SE 8 讀書心得筆記與習題-第二章 Steam API

圖片
Collection API本來就很常用,多了Stream 更是讓人不用管實作的完成很多演算工作。 不過實際用起來還是要花非常多時間,用法實在太多了,配上lambda更是眼花撩亂 第二章要點 你可以從集合 陣列 Generator或是iterator中創建Stream 使用filter來選擇元素,使用map來改變元素 要從Stream中獲得結果,請使用reduction操作符,例如count、max、min 、findFirst 或findAny,其中一些方法會獲得一個Optional值 你可以收集(collect) 集合 陣列 字符串或是map中的Stream結果 Collectors 類的groupBy和partitionBy允許你對Stream中的內容分組,並獲取每個組的結果 Java 對 基本型別 int long和double提供了專門的Stream 練習題與自己版本的解答 編寫一個2.1節中for循環的並型版本,獲取處理器的數量,創造出多個獨立的執行緒(線程),每個都只處理列表的一個片段,然後將他們各自的結果彙總起來(我們不希望這些執行緒都更新一個計數器,為什麼?) public class Exercise2_1 { public static void main(String[] args) throws IOException, InterruptedException, ExecutionException { String contents = new String( Files.readAllBytes(Paths.get("src/exercises/alice.txt")), StandardCharsets.UTF_8); // 邏輯直接使用範例程式碼 List words = Arrays.asList(contents.split("[\\P{L}]+")); long count = 0; for (String w : words) { ...

寫給大忙人看的Java SE 8 讀書心得筆記與習題-第一章 lambda 表示式

圖片
此書英文原名是: java se 8 for the really impatient 就算假裝忽略即將要正式發行的java 9,這也是一本2015就出版的簡中翻譯版。 java這幾年已經算是更新慢的主流語言,卻還有一堆東西要補阿....

hazelcast EntryUpdatedListener oldValue

用了好一陣子的hazelcast EntryUpdatedListener, 突然發現到偶爾會有取不到oldValue的狀況。 這下子當需要舊值來判斷狀態變動程式碼全部完蛋,只好乖乖的檢查問題在哪裡。 慘案 EX EntryEvent{ entryEventType=UPDATED , member=Member[192.168.31.22]:2901 , name='Device' , key=xxzz, oldValue=null, value=yyyy , mergingValue=null } 一開始檢查的範圍   找到邏輯上是否有會移除資料或是將資料設為NULL的程式碼   結果當然是沒有   看看沒有先觸發其他種類的Listener ,ex:entryAdded  結果還是沒有  檢查是不是因為tryLock導致資料更新過程被省略  試過兩隻主程式一直互相執行trylock更新IMap,  但只會出現 tryLock failed,不會出現oldValue=null的狀況 後來發現問題出在有些程式碼更新map的資料使用效能較好的 void com.hazelcast.core.IMap.set(String key, DeviceStatus value) 根據api doc說明 Warning: This method breaks the contract of EntryListener. When an entry is updated by set(), it fires an EntryEvent with a null oldValue. 實際測試程式碼 用set的方式的確不會取到oldValue ,所以改回get就修(?)好了 ,最後改code的也不是我XD 雖然是從來沒有使用過set方法, 但看code的時候完全沒發現使用的方法不同, 只聚焦在是不是有做過刪除或是set null... 不太了解邏輯為什麼要這樣設計, 但是人家都寫在api doc上了 只好承認用api時很少把全方法跟api doc看完。

與 object argument 的 溝通?

圖片
看來不只專案上溝通有落差,常常對程式的溝通上也常常有落差 本來在想怎麼避免夜晚寫code容易碰上的低級錯誤。 像是當遇上 object argument 要怎麼確認兩邊的型別對等之類的

Find bugs Call to equals() comparing different types

開始用findbugs跟 Code Coverage 以後, 我最忘不了的就是那些愚蠢的bug, 而且他們特別會出現在那些晚上寫的程式碼裡。 每當commit 前沒跑findbugs跟測試 , 通常都會學到新的findbugs 錯誤訊息... 低級到不好意思記錄下來,以下就是其中的一個例子

hazelcast predicate

老實說我對 jpa 的 criteria 跟 specification 查詢方式一直用起來很不順手,理解上也有問題。 使用上一直get來get去就算了,竟然使用字串來做查詢條件。 只要一改屬性名稱,就完全沒辦法用IDE 無痛 REFACTOR。 而且在做關聯性的查詢使用,簡直是不知道自己在做什麼。 最近使用IMDG的解決方案hazelcast。 平常在對MAP做操作時,也免不了要寫一堆predicate

編碼傳輸

老實講問題蠻低等的,但以前也從來沒用心了解過相關問題,有過就好... 問題: 發生瀏覽器端編輯新造字內容,透過server side 下載到終端設備的字元編碼有問題。 因為規範上設備接受的編碼是big5 ,所以做了ex:"wtf:編碼".getBytes(Charset.forName("big5"))的處理 理論上最後一個字應該要解成fa42 卻變成3f,也就是變成?而不是方塊字。

stripes Hidden form 的日期型態

    在 stripes @validate 檢核非常嚴格 一定要轉成日期才能當成值傳出去 < stripes:hidden id = "hidden.qryDateFrom" name = "qryDateFrom" formatPattern = "yyyy/MM/dd"/>