惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
SecWiki News
SecWiki News
Forbes - Security
Forbes - Security
N
News | PayPal Newsroom
S
Security @ Cisco Blogs
Schneier on Security
Schneier on Security
V
V2EX - 技术
S
Secure Thoughts
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
C
CERT Recently Published Vulnerability Notes
NISL@THU
NISL@THU
S
Securelist
S
Security Archives - TechRepublic
Know Your Adversary
Know Your Adversary
V
Vulnerabilities – Threatpost
Security Latest
Security Latest
Recent Commits to openclaw:main
Recent Commits to openclaw:main
G
GRAHAM CLULEY
H
Hacker News: Front Page
Microsoft Azure Blog
Microsoft Azure Blog
I
Intezer
Google Online Security Blog
Google Online Security Blog
美团技术团队
阮一峰的网络日志
阮一峰的网络日志
T
The Exploit Database - CXSecurity.com
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Webroot Blog
Webroot Blog
Jina AI
Jina AI
Engineering at Meta
Engineering at Meta
P
Proofpoint News Feed
The Cloudflare Blog
I
InfoQ
L
LangChain Blog
U
Unit 42
P
Proofpoint News Feed
S
Schneier on Security
S
Security Affairs
Y
Y Combinator Blog
T
Tenable Blog
N
News and Events Feed by Topic
MyScale Blog
MyScale Blog
量子位
Google DeepMind News
Google DeepMind News
Cyberwarzone
Cyberwarzone
博客园 - 聂微东
D
Darknet – Hacking Tools, Hacker News & Cyber Security
GbyAI
GbyAI
AWS News Blog
AWS News Blog

博客园 - 沧海一滴

CPU 负载高,到底应不应该告警? 微服务的10大问题及微服务的本质不是技术升级,而是组织关系的重构 通过抓包,深入揭秘MCP协议底层通信 浅谈为什么我讨厌分布式事务:各位的项目没到那个体量就别给自己找麻烦 Manus“删博、裁员、跑路新加坡”后,创始人首次复盘经验教训:不是比拼模型多聪明,而是比拼怎么让模型更有用。 分页插件pagehelper使用方法 UGREEN/绿联 网线钳 10952 (6P/8P两用多功能省力剥剪线钳) 1件 websocket 港股通开户测评答案 ./configure --with-debug --prefix=/Users/root/opt/nginx/debug_nginx 只是想装下nginx而已 % brew install nginx Chrome浏览设置多个账号,每个账号有对应的收藏设置等信息 心衰 间接物料和直接物料 图解 SQL 执行顺序,通俗易懂! SpringBoot starter 原理及如何自定义 starter 满意度调研 团队建设到哪种程度ok 藏不住“骨子里的穷”,这5个细节暴露其家境,都是穷人家的通病
Java开发利器Commons Lang之元组Tuple
沧海一滴 · 2024-05-11 · via 博客园 - 沧海一滴

标准Java库没有提供足够的方法来操作其核心类,Apache Commons Lang提供了这些额外的方法。

Apache Commons Lang为java提供了大量的帮助工具。lang API,特别是String操作方法、基本数值方法、对象反射、并发、创建和序列化以及System属性。此外,它还包含对java.util.Date的基本增强,以及一系列专门用于帮助构建方法的实用工具,如hashCode、toString和equals。

-- 来自官方简介http://commons.apache.org/proper/commons-lang/index.html

什么是元组?

元组(tuple)是关系数据库中的基本概念,关系是一张表,表中的每行(即数据库中的每条记录)就是一个元组,每列就是一个属性。 在二维表里,元组也称为行。 -- 摘自百度百科

如果从日常开发中我们可能经常遇到如下情形:我们写了某个方法,这个发放希望返回最大值和最小值两个值,这个时候怎么做呢?封装一个返回对象?或者返回一个json对象或者list,然后解析?这样确实有点难看!

那么好在Commons Lang给我们提供了一个tuple元组相关数据结构的实现,就可以帮助我们解决这种问题。

为什么使用元组tuple?

        元组和列表list一样,都可能用于数据存储,包含多个数据;但是和列表不同的是:列表只能存储相同的数据类型,而元组不一样,它可以存储不同的数据类型,比如同时存储int、string、list等,并且可以根据需求无限扩展。
        比如说在web应用中,经常会遇到一个问题就是数据分页问题,查询分页需要包含几点信息:当前页数、页大小;查询结果返回数据为:当前页的数据记录,但是如果需要在前台显示当前页、页大小、总页数等信息的时候,就必须有另外一个信息就是:数据记录总数,然后根据上面的信息进行计算得到总页数等信息。这个时候查询某一页信息的时候需要返回两个数据类型,一个是list(当前也的数据记录),一个是int(记录总数)。当然,完全可以在两个方法、两次数据库连接中得到这两个值。事实上在查询list的时候,已经通过sql查询得到总计录数,如果再开一个方法,再做一次数据库连接来查询总计录数,不免有点多此一举、浪费时间、浪费代码、浪费生命。言重了~在这种情况下,我们就可以利用二元组,在一次数据库连接中,得到总计录数、当前页记录,并存储到其中,简单明了!

Commons Lang Tuple

tuple相关的类位于org.apache.commons.lang3.tuple下,整个元组从是否可变的维度上分为可变元组和不可变元组;从元组元素数量的维度上分为二元组和三元组;然后两两组和,那么总共就有2x2种元组:可变二元组、不可变二元组、可变三元组、不可变三元组

先来看下元组整个类图:

从类图上我们大致可以看到整个类之间的关系,所有二元组的基类是Pair,而Pair是继承自了Map.Entry;而三元组的基类是Triple。接下来进入实战环节。

可变二元组 MutablePair

@Test
public void testMutablePair() {
    MutablePair<String, Boolean> mutablePair = MutablePair.of("test1", true);
    System.out.println("左值:" + mutablePair.getLeft() + " 右值:" + mutablePair.getRight());

    mutablePair.setLeft("test2");
    mutablePair.setRight(false);
    System.out.println("左值:" + mutablePair.getLeft() + " 右值:" + mutablePair.getRight());

输出:
左值:test1 右值:true
左值:test2 右值:false
}

不可变二元组 ImmutablePair

在不可变元组中,存储值的属性均被final修饰,因而不可变。

@Test
public void testImmutablePair() {
    ImmutablePair<String, Boolean> immutablePair = ImmutablePair.of("test1", true);
    System.out.println("左值:" + immutablePair.getLeft() + " 右值:" + immutablePair.getRight());
}

输出:
左值:test1 右值:true

可变三元组

@Test
public void testMutableTriple() {
    MutableTriple<String, Boolean, Integer> mutableTriple = MutableTriple.of("test1", true, 1);
    System.out.println(
        "左值:" + mutableTriple.getLeft() + " 中间值:" + mutableTriple.getMiddle() + " 右值:" + mutableTriple.getRight());

    mutableTriple.setLeft("test2");
    mutableTriple.setMiddle(false);
    mutableTriple.setRight(2);
    System.out.println(
        "左值:" + mutableTriple.getLeft() + " 中间值:" + mutableTriple.getMiddle() + " 右值:" + mutableTriple.getRight());
}

输出:
左值:test1 中间值:true 右值:1
左值:test2 中间值:false 右值:2

不可变三元组

不可变的原理同二元组,通过final修饰属性。

@Test
public void testImmutableTriple() {
    ImmutableTriple<String, Boolean, Integer> immutableTriple = ImmutableTriple.of("test1", true, 1);
    System.out.println(
        "左值:" + immutableTriple.getLeft() + " 中间值:" + immutableTriple.getMiddle() + " 右值:" + immutableTriple.getRight());
}

输出:
左值:test1 中间值:true 右值:1
 

https://www.jianshu.com/p/dcedc7765eb8