Guava ——Joiner和Splitter

news2024/9/25 11:22:38
大家好,这里是 一口八宝周 👏
欢迎来到我的博客 ❤️一起交流学习
文章中有需要改进的地方请大佬们多多指点 谢谢 🙏

在本篇文章中,我将用实例展示,如何使用Joiner将集合转换为 String ,以及使用Splitter将 String 拆分为集合。

首先我们需要导入关键的依赖

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>

下面就直接代码展示

以下参考:https://www.baeldung.com/guava-joiner-and-splitter-tutorial

package guava;

import com.alibaba.fastjson.JSON;
import com.google.common.base.Function;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import org.junit.Test;

import java.util.*;

public class GuavaDemo {

    /**
     * 1.使用Joiner将列表转换为字符串
     */
    @Test
    public void ListConvertString() {
        List<String> names = Lists.newArrayList("zxt","lan","hhh");
        String result = Joiner.on(",").join(names);
        System.out.println(result); //zxt,lan,hhh

        //使用Joiner处理空值,跳过空值,使用skipNulls()
        List<String> nameList = Lists.newArrayList("zxt", null, "lan");
        String str = Joiner.on(",").skipNulls().join(nameList);
        System.out.println(str); //zxt,lan

        //替换空值,使用useForNull()
        String str1 = Joiner.on(",").useForNull("hhh").join(nameList);
        System.out.println(str1); //zxt,hhh,lan
    }

    /**
     * 2.使用Joiner将Map转换为字符串
     */
    @Test
    public void MapConvertString() {
        List<String> names = Lists.newArrayList("zxt","lan","hhh");
        Map<Integer,String> userMap = Maps.newHashMap();
        userMap.put(1,"zxt");
        userMap.put(2,"lan");
        String result = Joiner.on(",").withKeyValueSeparator(":").join(userMap);

        System.out.println(result); //1:zxt,2:lan
    }

    /**
     * 3.嵌套集合,将每个List转换为String
     */
    @Test
    public void CollectionsJoined() {

        List<ArrayList<String>> userList = Lists.newArrayList(
                Lists.newArrayList("zxt","lan","hhh"),
                Lists.newArrayList("java","spark","c++"),
                Lists.newArrayList("hangzhou","wuhan","shanghai")
        );

        System.out.println(userList); //[[zxt, lan, hhh], [java, spark, c++], [hangzhou, wuhan, shanghai]]
        String result = Joiner.on(";").join(Iterables.transform(userList,
                new Function<ArrayList<String>, String>() {
                    @Override
                    public String apply(ArrayList<String> strings) {
                        return Joiner.on("-").join(strings);
                    }
                }
        ));
        System.out.println(result); //zxt-lan-hhh;java-spark-c++;hangzhou-wuhan-shanghai
    }

    /**
     * 4.连接多个字符串
     */
    @Test
    public void CreateStrFromStr() {
        //也可单独写一个方法,参数为String...args
        String result = Joiner.on(",").skipNulls().join("hello", null, "lan");

        System.out.println(result); //hello,lan
    }

    /**
     * 5.使用拆分器从字符串创建list
     */
    @Test
    public void CreateListFromStr() {
        String str = "zxt-lan-happy";
        List<String> list = Splitter.on("-").trimResults().splitToList(str);

        System.out.println(list); //[zxt, lan, happy]
    }

    /**
     * 6.使用Splitter从字符串创建map
     */
    @Test
    public void CreateMapFromStr() {
        String str = "zxt-hangzhou;lan-wuhan";
        Map<String,String> userMap = Splitter.on(";").withKeyValueSeparator("-").split(str);

        System.out.println(userMap); //{zxt=hangzhou, lan=wuhan}
    }

    /**
     * 7.使用多个分隔符拆分字符串
     */
    @Test
    public void SplitStrOnMultipleSeparator() {
        String str = "zxt.hangzhou,,lan-wuhan";
        List<String> list = Splitter.onPattern("[.,-]").omitEmptyStrings().splitToList(str);

        System.out.println(list); //[zxt, hangzhou, lan, wuhan]
    }

    /**
     * 8.以特定长度拆分字符串
     */
    @Test
    public void SplitStrOnSpecificLength() {
        String str = "zxt lan";
        List<String> list = Splitter.fixedLength(2).splitToList(str);

        System.out.println(JSON.toJSONString(list)); //["zx","t ","la","n"]
    }

    /**
     * 9.限制拆分结果
     */
    @Test
    public void LimitSplit() {
        String str = "zxt,lan,hhh,qqq,lpp";
        List<String> list = Splitter.on(",").limit(3).splitToList(str);

        System.out.println(JSON.toJSONString(list)); //["zxt","lan","hhh,qqq,lpp"]
    }

}

通过上述代码实例,相信很多小伙伴都已经掌握了Joiner的用法,当然啦~知其然知其所以然,我们继续挖掘,看一下源码。

通过查看源码,我们可以知道

一个用分隔符连接文本片段(指定为 array, Iterable, varargs or even a Map)的对象,它要么将结果附加到Appendable,要么将其作为字符串返回。

List<String> nameList = Lists.newArrayList("zxt", null, "lan");
String str = Joiner.on(",").skipNulls().join(nameList);

以上代码为例,在返回zxt,lan结果之前,所有的元素都使用了Object.toString()转化为字符串,如果没有skipNulls()useForNull(String)方法的话,该代码会返回NullPointerException异常。

通过代码可以看到Joiner的源码是私有的,因此不能直接去创建对象,而是通过现有提供的公有静态方法on(String separator)on(char separator)来构建对象。

继续以上述代码为例,我们进入join方法,继而进入StringBuilder appendTo(StringBuilder builder, Iterator<?> parts)方法,该方法传入的是StringBuilder对象,为的是保证线程安全。然后调用了appendTo(A appendable, Iterator<?> parts) throws IOException方法,通过观察可以看到所有的拼接字符串最终都会调用此方法,因此该方法是Joiner的核心方法。

方法执行步骤:

  1. 由于无法保证appendable不为空即传入的builder,因此对builder进行了判空操作,如果为空的话就抛出异常。

  1. 迭代器遍历确保没有多余的分隔符。

  1. 重写了toString方法,防止容器中有null对象。

通过以上步骤完成了数据的拼接返回字符串。

好啦,就到这里~拜拜👋

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用EvilTree在文件中搜索正则或关键字匹配的内容

关于EvilTree EvilTree是一款功能强大的文件内容搜索工具&#xff0c;该工具基于经典的“tree”命令实现其功能&#xff0c;本质上来说它就是“tree”命令的一个独立Python 3重制版。但EvilTree还增加了在文件中搜索用户提供的关键字或正则表达式的额外功能&#xff0c;而且还…

Android性能优化系列篇:弱网优化

弱网优化1、Serializable原理通常我们使用Java的序列化与反序列化时&#xff0c;只需要将类实现Serializable接口即可&#xff0c;剩下的事情就交给了jdk。今天我们就来探究一下&#xff0c;Java序列化是怎么实现的&#xff0c;然后探讨一下几个常见的集合类&#xff0c;他们是…

sklearn中的数据预处理和特征工程

目录 一.数据挖掘的五大流程 1. 获取数据 2. 数据预处理 3. 特征工程&#xff1a; 4. 建模&#xff0c;测试模型并预测出结果 5. 上线&#xff0c;验证模型效果 二.数据预处理 1.数据无量纲化 2.preprocessing.MinMaxScaler(数据归一化) 3.preprocessing.Standard…

Linux编译器——gcc/g++(预处理、编译、汇编、链接)

目录 0.程序实现的两大环境 1.gcc如何完成 预处理 编译 汇编 链接 2.动态库与静态库 对比二者生成的文件大小 3. gcc常用选项 0.程序实现的两大环境 任何一个C程序的实现都要经过翻译环境与执行环境。 在翻译环境中又分为4个部分&#xff0c;预编译、编译、汇编与链…

Spring Cloud配置application.yml与bootstrap.yml区别及多profile配置 | Spring Cloud 6

一、前言 Spring Cloud 构建于 Spring Boot 之上&#xff0c;在 Spring Boot 中有两种上下文&#xff0c;一种是 bootstrap&#xff0c;另外一种是 application。 二、bootstrap与application (.yml/.properties) 2.1 两者区别 bootstrap.yml/bootstrap.properties 和 appl…

CHAPTER 3 Web HA集群部署 - Keepalived

Web HA集群部署 - Keepalived1. Keepalived概述1.1 工作原理1.2 核心功能1.3 拓扑图2. KeepAlived安装方式2.1 yum源安装2.2 源码包编译3. KeepAlived安装3.1 环境依赖3.2 安装nginx3.3 安装Keepalived4. Keepalived部署4.1 主备模式1. 节点配置2. 主节点配置文件3. 从节点配置…

金三银四了,准备跳槽的可以看看....

前两天跟朋友感慨&#xff0c;去年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经3月了&#xff0c;具体的金三银四也已经到来了。 对于想跳槽的职场人来说&#xff0c;绝对要已经提前做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也出来了。…

谷粒学苑第七 八 九天

谷粒学苑第七天 上传到服务器 文件上传到接口中 在接口中读取内容 加到数据库 swagger&#xff1a; 报了实体类的错&#xff1a;刚刚这里忘记写数据了 一级二级都查出来了&#xff1a; 课程发布流程确认 报错&#xff1a; 实体类全部改为_STR还是报错 org.springfr…

Java线程池源码分析

Java 线程池的使用&#xff0c;是面试必问的。下面我们来从使用到源码整理一下。 1、构造线程池 通过Executors来构造线程池 1、构造一个固定线程数目的线程池&#xff0c;配置的corePoolSize与maximumPoolSize大小相同&#xff0c; 同时使用了一个无界LinkedBlockingQueue存…

《PyTorch深度学习实践10》——循环神经网络-基础篇(Basic-Recurrent Neural Network)

目录一、RNN简介二、RNN Cell用法三、RNN用法三、实例&#xff1a;hello换序1.RNN Cell2.RNN四、Embedding一、RNN简介 RNN网络最大的特点就是可以处理序列特征&#xff0c;就是我们的一组动态特征。比如&#xff0c;我们可以通过将前三天每天的特征&#xff08;是否下雨&#…

七、SpringBoot_自动装配

自动装配 官方文档 SpringBoot自动配置尝试根据您添加的 jar 依赖项自动配置您的 Spring 应用程序 Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. SpringBoot定义了一套接…

详谈IIC

前言 在嵌入式底层系统中&#xff0c;常见的通讯方式&#xff0c;串口&#xff0c;IIC&#xff0c;SPI&#xff0c;IIS等&#xff0c;一般IIC,SPI,IIS更多的采取IO模拟&#xff0c;其余CAN,UART均是硬件设计直接支持&#xff0c;而IIC主要用于多数传感器数据的读写&#xff0c…

【c++基础】

C基础入门统一初始化输入输出输入输出符输入字符串const与指针c和c中const的区别const与指针的关系常变量与指针同类型指针赋值的兼容规则引用引用的特点const引用作为形参替换指针其他引用形式引用和指针的区别inline函数缺省参数函数重载判断函数重载的规则名字粉碎C编译时函…

Goby 征文大擂台,超值盲盒等你来!

001 Goby 技术征文正式启动 Goby 致力于做最好的网络安全工具。为了促进师傅们知识共享和技术交流&#xff0c;现发起关于 Goby 的技术文章征集活动&#xff01; 欢迎所有师傅们参加&#xff0c;分享您的使用经验或挖洞窍门等&#xff0c;帮助其他人更好地了解和利用 Goby。 …

Winform界面实现控件中英文语言切换

一、业务需求 在Winform项目的开发过程中,涉及到一个基础的功能就是需要对界面中的显示语言内容可以进行选择切换,方便不同地区的使用者快速上手使用;效果如下: 二、需求分析 需要实现对Winform项目界面显示语言可选择切换步骤如下: ①修改控件的显示内容; ②获取到界面显…

【计算机网络】数据链路层

概述 封装成帧 差错检验 可靠传输 实现机制 可靠传输的实现机制 停止等待协议 回退N帧协议 选择重传协议 【计算机网络】MAC帧和PPP帧&#xff08;定义使用范围区别共同点&#xff09;_GPNU_Log的博客-CSDN博客_ppp帧 PPP帧和以太网帧 | Mixoo 数据链路层的协议有PPP协…

Rman单实例迁移到单实例

关于同平台同版本数据库之间的迁移操作的实验 ---Source DB[rootoracle-db-19cs ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19cs ~]# --- Target DB[rootoracle-db-19ct ~]# cat /etc/redhat-release CentOS Stream release 8 [rootoracle-db-19ct…

如何使用dlinject将一个代码库实时注入到Linux进程中

关于dlinject dlinject是一款针对Linux进程安全的注入测试工具&#xff0c;在该工具的帮助下&#xff0c;广大研究人员可以在不使用ptrace的情况下&#xff0c;轻松向正在运行的Linux进程中注入一个共享代码库&#xff08;比如说任意代码&#xff09;。之所以开发该工具&#…

扬帆优配|新概念火了!时空大数据龙头再冲击涨停

时空大数据近期受资金追捧。 今天早盘&#xff0c;中通邦本开盘后再度冲击涨停&#xff0c;一度封死涨停板&#xff0c;之后涨停打开&#xff0c;截至上午收盘仍上涨超5%。此前&#xff0c;中通邦本已接连两日涨停&#xff0c;公司在互动渠道上表示&#xff0c;参股公司北京邦本…

Spring中Bean生命周期及循环依赖

spring中所说的bean对象 与 我们自己new的对象(原始对象)是不同的&#xff1b;bean对象是指spring框架创建管理的我们的对象生命周期即&#xff1a;何时生&#xff0c;何时死1.实例化 Instantiation&#xff1a;spring通过反射机制以及工厂创建出来的原始对象&#xff1b;2.属性…