天天看點

Java 中 List 分片的 5 種方法!

前些天在實作 MyBatis 批量插入時遇到了一個問題,當批量插入的資料量比較大時,會導緻程式執行報錯,如下圖所示:

原因是 MySQL 隻能執行一定長度的 SQL 語句,但當插入的資料量較多時,會生成一條很長的 SQL,這樣程式在執行時就會報錯。

要解決這個問題,有兩種方法:第一,設定 MySQL 可以執行 SQL 的最大長度;第二,将一個大 List 分成 N 個小 List 進行。由于無法準确的界定程式中最大的 SQL 長度,是以最優的解決方案還是第二種,于是就有了今天的這篇文章。

将一個 List 分成多個小 List 的過程,我們稱之為分片,當然也可以叫做“List 分隔”,選一個你喜歡的、好了解的叫法就行。

在 Java 中,分片的常見實作方法有以下幾種:

使用 Google 的 Guava 架構實作分片;

使用 Apache 的 commons 架構實作分片;

使用國産神級架構 Hutool 實作分片;

使用 JDK 8 中提供 Stream 實作分片;

自定義分片功能。

接下來我們分别來看。

先在項目的 pom.xml 中添加架構支援,增加以下配置:

有了 Guava 架構之後,隻需要使用 Lists.partition 方法即可實作分片,如下代碼所示:

以上代碼的執行結果如下圖所示:

有了 commons 架構之後,隻需要使用 ListUtils.partition 方法即可實作分片,如下代碼所示:

有了 Hutool 架構之後,隻需要使用 ListUtil.partition 方法即可實作分片,如下代碼所示:

Stream

通過 JDK 8 中的 Stream 來實作分片就無需添加任何架構了,具體的實作代碼如下:

此方式的優點的無需添加任何架構,但缺點是隻能實作簡單的分片(将一個 List 分為兩個),并且要有明确的分片條件。比如本篇案例中設定的分片條件就是數組是否大于 3,如果大于 3 就會被歸為一組,否則就會被分到另一組。

如果你不想引入第三方架構,并且使用 Stream 也無法滿足你的需求,你就可以考慮自己寫代碼來實作分片功能了。因為此方式不常用,是以咱們這裡隻給出關鍵方法。

自定義分片功能的關鍵實作方法是 JDK 自帶的 subList 方法,如下圖所示:

使用示例如下:

本文介紹了 5 種 List 分片的實作方法,其中最友善的實作方式是引入第三方架構,比如 Google 的 Guava、Apache 的 Commons 或者是國産開源的 Hutool 都可以,當然如果你的項目已經包含了以上任意一種,直接使用就行了。如果是簡單的分片就可以考慮使用 JDK 的 Stream 或者是 List 内置的 subList 方法來實作分片功能了。

關注公衆号「Java中文社群」檢視更多 Java 總結性系列文章。

關注下面二維碼,訂閱更多精彩内容。

Java 中 List 分片的 5 種方法!
Java 中 List 分片的 5 種方法!
Java 中 List 分片的 5 種方法!

關注公衆号(加好友):

Java 中 List 分片的 5 種方法!

作者:

王磊的部落格

出處:

http://vipstone.cnblogs.com/