文章目录

前言
博主介绍:✌目前全网粉丝4W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。
涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。
博主所有博客文件目录索引:博客目录索引(持续更新)
CSDN搜索:长路
视频平台:b站-Coder长路
引由
在调公司内部中多次使用到了guava包中的工具类,进而来进行记录梳理下。
初始
引入guava包:
xml
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
Lists.partition
场景:list集合中数据量过大,可根据需要进行拆分,进而通过循环或者多线程来处理数据。
使用:Lists.partition方法,根据传入的size,对list进行拆分
java
public class PartitionTest {
@Test
public void test() {
// 准备数据
List<String> list = new ArrayList<>();
list.add("快");
list.add("敲");
list.add("代");
list.add("码");
list.add("去");
// 将集合list按照 2 个元素一份进行划分
List<List<String>> partition = Lists.partition(list, 2);
System.out.println(partition);
System.out.println("----------分------------割-------------线----------");
for (List<String> strings : partition) {
// 你需要处理的业务逻辑
System.out.println(strings);
}
}
}
公司优化的点:
java
//每50条来拆分为一个集合
List<List<ComponentConfig>> partition = Lists.partition(saveComponent, 50);
for (List<ComponentConfig> componentConfigs : partition) {
componentConfigDao.insertBatch(componentConfigs);
}
ImmutableSet(Java不可变集合)
java
HANA(15, "Hana"),
STARROCKS(16, "StarRocks"),
HASHDATA(17, "HashData"),
//实战例子,不可变集合枚举
private static final ImmutableSet<MultiEngineType> CAN_BIND_ACCOUNT_ENGINE_TYPE = ImmutableSet.of(TIDB, ORACLE, GREENPLUM, ANALYTICDB_FOR_PG);
HashBasedTable
知识点学习
学习博客:https://blog.csdn.net/weixin_42073629/article/details/106604463
Guava包提供了Table集合类型,来支持这种数据结构Map<FirstName, Map<LastName, Person>>的使用场景,Table支持"row"和"column",而且提供多种视图:
Table视图:
- rowMap()返回一个Map<R, Map<C, V>>的视图。rowKeySet()类似地返回一个Set。
- row®返回一个非null的Map<C, V>。修改这个视图Map也会导致原表格的修改。
- 和列相关的方法有columnMap(), columnKeySet()和column©。(基于列的操作会比基于行的操作效率差些)
- cellSet()返回的是以Table.Cell<R, C, V>为元素的Set。这里的Cell就类似Map.Entry,但是它是通过行和列来区分的。
Table有以下实现:
- HashBasedTable:基于HashMap<R, HashMap<C, V>>的实现。
- TreeBasedTable:基于TreeMap<R, TreeMap<C, V>>的实现。
- ImmutableTable:基于ImmutableMap<R, ImmutableMap<C, V>>的实现。(注意,ImmutableTable已对稀疏和密集集合做了优化)
- ArrayTable:ArrayTable是一个需要在构建的时候就需要定下行列的表格。这种表格由二维数组实现,这样可以在密集数据的表格的场合,提高时间和空间的效率。
简洁:我们可将这种map、map形式看做是一个excel表有行列相对应,其中存储在指定行列中的就是固定值。
案例
java
import com.google.common.collect.HashBasedTable;
/**
* @author changlu
* @version 1.0
* @description Guava之HashBasedTable学习
* @date 2024/03/29 14:45
*/
public class Main {
public static void main(String[] args) {
//基于HashMap<R, HashMap<C, V>>的实现。
//是不是有点像二维表格的表示
HashBasedTable<String, Integer, String> aTable = HashBasedTable.create();
// 使用两层循环填充Table数据。外层循环代表行,字符A到C。内层循环代表列,数字1到3。
// 关注的数据实际就是在 String.format("%c%d", a, b)
/**
1 2 3
------------------------------------
A | A1 A2 A3
B | B1 B2 B3
C | C1 C2 C3
*/
for (char a = 'A'; a <= 'C'; ++a) {
for (Integer b = 1; b <= 3; ++b) {
// 将数据放入Table中,使用字符转换为字符串作为行键,整数作为列键,格式化字符串作为值。
aTable.put(Character.toString(a), b, String.format("%c%d", a, b));
}
}
//1、查询列数据
// 打印第2列的所有数据,即为:{A=A2, B=B2, C=C2}
System.out.println(aTable.column(2));
//2、查询行数据
// 打印键为"B"的行的所有数据,即为:{1=B1, 2=B2, 3=B3}
System.out.println(aTable.row("B"));
//3、查询指定行列数据
// 打印键为"B"的行,列键为2的单元格数据,即为:B2
System.out.println(aTable.get("B", 2));
//4、判断是否指定行列键存在
// 检查Table中是否存在行键为"D",列键为1的数据,即为不存在
System.out.println(aTable.contains("D", 1));
System.out.println(aTable.contains("A", 1));//存在
//5、判断是否存在列键存在
// 检查Table中是否存在列键为3的列,即true
System.out.println(aTable.containsColumn(3));
//6、判断是否存在指定列键
// 检查Table中是否存在键为"C"的行,即为true
System.out.println(aTable.containsRow("C"));
//7、打印所有列数据,即为:{1={A=A1, B=B1, C=C1}, 2={A=A2, B=B2, C=C2}, 3={A=A3, B=B3, C=C3}}
System.out.println(aTable.columnMap());
//8、打印所有行数据,即为:{A={1=A1, 2=A2, 3=A3}, B={1=B1, 2=B2, 3=B3}, C={1=C1, 2=C2, 3=C3}}
System.out.println(aTable.rowMap());
//9、移出指定行列数据
//移除键为"B"的行,列键为3的数据,并打印被移除的数据,即为:B3
System.out.println(aTable.remove("B", 3));
}
}
资料获取
大家点赞、收藏、关注、评论啦~
精彩专栏推荐订阅:在下方专栏👇🏻
- 长路-文章目录汇总(算法、后端Java、前端、运维技术导航):博主所有博客导航索引汇总
- 开源项目Studio-Vue---校园工作室管理系统(含前后台,SpringBoot+Vue):博主个人独立项目,包含详细部署上线视频,已开源
- 学习与生活-专栏:可以了解博主的学习历程
- 算法专栏:算法收录
更多博客与资料可查看👇🏻获取联系方式👇🏻,🍅文末获取开发资源及更多资源博客获取🍅