歡迎光臨
每天分享高質量文章

Java Web技術經驗總結(十五)

  1. MySQL在舊表中增加唯一索引時,如何處理原有的重覆資料?參考:mysql刪除重覆記錄只保留一條delete from `target_table` where id in (Select * from (select max(id) from `fans_sync_job`  where 1=1 group by mp_id, job_type, job_status having count(*) > 1) as b);

  2. google的commons包有很多有用的工具,今天遇到一個問題,判斷兩個字串是否可以正常轉換為數字型別,可以使用NumberUtils這個工具類。

  3. MySQL知識:MySQL刪除資料不會回收空間,刪除表才會回收空間

  4. Fork/Join 樣式有自己的適用範圍。如果一個應用能被分解成多個子任務,並且組合多個子任務的結果就能夠獲得最終的答案,那麼這個應用就適合用 Fork/Join 樣式來解決。Fork/Join框架是ExecutorService的一種實現,也會把任務提交到執行緒池中去執行,它的特殊之處在於使用了工作竊取演演算法——已經處理完自己的任務的執行緒可以“竊取”其他正在忙碌執行的執行緒的任務來執行。參考:oracle官方學習檔案 

  5. Java SE8中的java.util.Arrays工具類中的parallelSort()方法就使用了Fork/Join框架進行排序。在多核系統上,使用並行演演算法對大陣列進行排序比順序演演算法要快很多。

  6. 文章閱讀——Java 8中的日期API,借鑒了Joda Time庫的良好設計,在升級到Java 8後基本可以不用再使用Joda Time這個第三方庫。Java 8中的日期API主要包括以下六個方面:日期(java.time.LocalDate)、時間(java.time.LocalTime)、時間戳(java.time.Instant)、日期時間(java.time.LocalDateTime)、工具API(上述每個類都實現了很多有用的工具API,例如日期加減)、格式解析(format方法和DateTimeFormatter工具類)等。程式碼可以參見:Learn Java

  7. Java併發包中有很多基礎工具,其中包括阻塞佇列。今天閱讀The Java Specialists’ Newsletter的一篇文章:Blocking Queue,其中寫了阻塞佇列的基本實現原理,並給出了一個基本的測試用例。

  8. 文章閱讀:使用 Java8 Optional 的正確姿勢。Optional的使用:(1)呼叫get()方法之前要先判斷某個值是否被提供,A get() not preceded by a call to isPresent() is a bug;(2)最近Stuart Marks建議使用getWhenPresent()方法來代替get(),不過這個函式名字取得不太好;(3)Optional 中我們真正可依賴的應該是除了 isPresent() 和 get() 的其他方法;(4)用了 isPresent() 處理 NullPointerException 不叫優雅, 有了  orElse, orElseGet 等, 特別是 map 方法才叫優雅.

  9. 使用Optional的錯誤姿勢:

  • 呼叫 isPresent()方法時

  • 呼叫 get()方法時

  • Optional 型別作為類/實體屬性時

  • Optional 型別作為方法引數時

  • 在J2EE專案中,利用MyBatis的動態陳述句,每張表只需要一個insert sql、每張表只需要一個update sql,對於查詢介面,由於每個介面需要的欄位不一樣,因此可以提供多個不同的查詢SQL。

  • Java 8中的Lambda 運算式詳解:可被傳遞(存放)的匿名函式的簡寫形式。

    • 匿名:不需要像平常的方法一樣需要起名字

    • 函式:有引數、函式體、傳回值,甚至可以丟擲異常

    • 傳遞:可以用作函式引數或者儲存在區域性變數中

    • 簡潔:不需要寫一大堆模板程式碼 

  • 函式式介面(functional interface):一種特定的Java介面——只定義了一個抽象方法。在Java 8中為介面提供了“預設方法(default method)”,在這裡可以確定:即使一個介面中有多個預設方法,只要 它是隻定義了一個抽象方法,那麼該介面仍然是函式式介面。在java.util.functional包中,Java 8提供了一些常見的函式標識:

    • Predicate:接受一個泛型(T)物件,並傳回boolean。如果你需要一個包含泛型(T)物件的布林運算式,則可以使用java.util.functional.Predicate

      定義一個Lambda運算式;

    • Consumer:接受一個泛型(T)物件,並且傳回void。如果你需要訪問一個泛型(T)物件,並基於它做一些操作,就可以使用。

    贊(0)

    分享創造快樂