优雅提效:Guava的字符串处理工具

news2024/11/25 1:01:45

第1章:引言

大家好,我是小黑,今天咱们要聊一聊Google Guava这个超棒的Java库,尤其是它的字符串处理工具。对于Java程序员来说,字符串处理是日常工作的一部分,而Guava在这方面提供了非常强大的支持。使用Guava处理字符串不仅可以提高效率,而且代码会更简洁、更优雅。

Guava库由Google开发,它包含了很多Google在日常项目开发中积累的最佳实践。今天咱们重点看看其中的三个神器:Joiner、Splitter和CharMatcher。这些工具能让咱们在处理字符串时如鱼得水,轻松应对各种复杂场景。好了,话不多说,咱们直接进入正题!

第2章:Guava字符串处理工具概览

2.1 Joiner:拼接王者

Joiner,顾名思义,它是用来拼接字符串的。它可以轻松处理null值、添加分隔符,甚至还能用于StringBuilder或输出流。比如,咱们想把一个字符串列表用逗号拼接起来,但列表中有些元素可能是null,传统的Java处理方式可能需要写不少代码。而使用Joiner,只需一行代码!

List<String> strings = Arrays.asList("Java", null, "Guava", "Python");
String result = Joiner.on(", ").skipNulls().join(strings);
System.out.println(result); // 输出: Java, Guava, Python

2.2 Splitter:分割小能手

紧接着是Splitter,它的作用正好与Joiner相反,用来分割字符串。Splitter不仅可以根据指定分隔符进行分割,还能自动去除空格、限制分割结果的数量等。想象一下,咱们有一个用逗号分隔的字符串,现在要把它分割成单独的元素。用Java自带的split方法可能还得处理空格和空字符串,但用Splitter,一切都变得简单了。

String toSplit = " Java, Guava ,, Python ";
Iterable<String> parts = Splitter.on(',')
        .trimResults()
        .omitEmptyStrings()
        .split(toSplit);
parts.forEach(System.out::println); // 依次输出: Java Guava Python

2.3 CharMatcher:字符匹配专家

最后是CharMatcher,这个工具可以在字符串中进行各种字符级别的操作,比如去除控制字符、保留数字字符等。CharMatcher提供了一系列静态工厂方法,让咱们可以轻松创建各种匹配器。例如,咱们要从一个字符串中去除所有的数字,只需简单几行代码。

String input = "abc123xyz456";
String result = CharMatcher.inRange('0', '9').removeFrom(input);
System.out.println(result); // 输出: abcxyz

看到这里,咱们已经对Guava的字符串处理工具有了一个基本的认识。接下来,咱们将深入探讨每个工具的具体使用方法和技巧。

第3章:Joiner的深入探究

咱们来聊聊Guava中的Joiner,这个小工具真是拼接字符串的高手。它不仅用起来超方便,而且功能强大,能解决很多常见的字符串拼接问题。说到底,Joiner就是让咱们的代码更简洁、更易读。

3.1 Joiner基础用法

先来看看Joiner的基础用法。假设咱们有一堆字符串需要用某个分隔符拼接起来,传统的Java方法可能需要循环,判断null值,还得处理最后一个分隔符。但是,用Joiner就简单多了。

List<String> items = Arrays.asList("Apple", "Banana", "Orange");
String result = Joiner.on(", ").join(items);
System.out.println(result); // 输出: Apple, Banana, Orange
3.2 处理Null值

Joiner在处理null值方面表现得尤为出色。有时候咱们的集合里会有null值,如果直接拼接可能会出问题。Joiner提供了两种处理方式:跳过null值或用其他字符串替换null值。

  • 跳过null值
List<String> itemsWithNull = Arrays.asList("Apple", null, "Orange");
String resultSkipNulls = Joiner.on(", ").skipNulls().join(itemsWithNull);
System.out.println(resultSkipNulls); // 输出: Apple, Orange
  • 替换null值
String resultUseForNull = Joiner.on(", ").useForNull("No Fruit").join(itemsWithNull);
System.out.println(resultUseForNull); // 输出: Apple, No Fruit, Orange
3.3 与StringBuilder和输出流的结合

Joiner不仅可以返回字符串,还可以直接作用于StringBuilder或输出流,这在处理大量数据拼接时特别有用。

  • StringBuilder使用
StringBuilder sb = new StringBuilder("Fruits: ");
Joiner.on(", ").appendTo(sb, items);
System.out.println(sb); // 输出: Fruits: Apple, Banana, Orange
  • 输出流使用
// 假设有一个OutputStream out
OutputStream out = new ByteArrayOutputStream();
Joiner.on(", ").appendTo(new OutputStreamWriter(out), items);
// 这里out中就包含了拼接好的字符串
3.4 Joiner的高级技巧

Joiner还有一些高级技巧。比如,咱们有时需要对Map进行拼接,或者需要处理复杂的数据结构。

  • Map拼接
Map<String, Integer> map = new HashMap<>();
map.put("Apple", 5);
map.put("Banana", 3);
String mapResult = Joiner.on(", ").withKeyValueSeparator("->").join(map);
System.out.println(mapResult); // 输出: Apple->5, Banana->3
  • 处理复杂数据结构
// 假设有一个复杂的List<CustomObject>结构
List<CustomObject> complexList = Arrays.asList(new CustomObject("Apple", 5), new CustomObject("Banana", 3));
// 可以先转换成字符串列表,再进行拼接
List<String> complexStrings = complexList.stream()
    .map(object -> object.getName() + ":" + object.getCount())
    .collect(Collectors.toList());
String complexResult = Joiner.on(", ").join(complexStrings);
System.out.println(complexResult); // 输出: Apple:5, Banana:3

小黑给大家的建议是,无论是处理简单还是复杂的字符串拼接任务,Joiner都是一个非常好的选择。它的强大功能和简洁的用法,可以大幅提高编码效率,也让代码看起来更加优雅。

第4章:Splitter的使用技巧

Splitter和Joiner正好相反,它是用来分割字符串的。在Java的世界里,字符串分割听起来简单,但要做得优雅和高效却不容易。好在有了Splitter,这些问题都迎刃而解了。

4.1 Splitter基础用法

咱们来看看Splitter的基本用法。假设咱们有一个用逗号分隔的字符串,现在要将其分割成单独的部分。使用Java的split方法也许能完成任务,但Splitter能做得更好。

String input = "a,b,c,d,e";
List<String> result = Splitter.on(',').splitToList(input);
System.out.println(result); // 输出: [a, b, c, d, e]
4.2 去除空白和空字符串

Splitter还能自动去除空格和空字符串,这在处理实际数据时特别有用。比如,有时候分割的元素前后可能会有多余的空格,或者分隔符之间没有内容。

  • 去除空格
String inputWithSpaces = "a, b ,  c ,d,   e";
List<String> resultWithTrim = Splitter.on(',')
    .trimResults()
    .splitToList(inputWithSpaces);
System.out.println(resultWithTrim); // 输出: [a, b, c, d, e]
  • 忽略空字符串
String inputWithEmpty = "a,,b,,,c,d,e,,";
List<String> resultOmitEmpty = Splitter.on(',')
    .omitEmptyStrings()
    .splitToList(inputWithEmpty);
System.out.println(resultOmitEmpty); // 输出: [a, b, c, d, e]
4.3 限制分割结果

Splitter甚至可以限制分割结果的数量。这在处理一些复杂的字符串时特别有用,比如,只需要前几个分割的元素。

String inputForLimit = "a,b,c,d,e";
List<String> resultWithLimit = Splitter.on(',')
    .limit(3)
    .splitToList(inputForLimit);
System.out.println(resultWithLimit); // 输出: [a, b, c,d,e]
4.4 高级分割

Splitter还有一些更高级的分割技巧。比如,根据正则表达式分割,或者处理Map类型的字符串。

  • 正则表达式分割
String inputRegex = "apple-123|banana-456|orange-789";
List<String> resultRegex = Splitter.onPattern("\\|")
    .trimResults()
    .splitToList(inputRegex);
System.out.println(resultRegex); // 输出: [apple-123, banana-456, orange-789]
  • Map字符串分割
String inputMapString = "apple=123,banana=456,orange=789";
Map<String, String> resultMap = Splitter.on(',')
    .withKeyValueSeparator('=')
    .split(inputMapString);
System.out.println(resultMap); // 输出: {apple=123, banana=456, orange=789}

Splitter的这些功能让字符串分割不再是一件繁琐的任务。使用Splitter,咱们可以更加自由和灵活地处理字符串,而且代码看起来既简洁又优雅。无论是简单的逗号分隔,还是复杂的正则表达式匹配,Splitter都能轻松搞定。这就是Guava给我们带来的便利,让编程变得更加简单和有趣。

第5章:CharMatcher的实际应用

本章的焦点是CharMatcher。这个工具可以说是处理字符串中字符级别操作的大师。无论是移除特定字符、保留某些字符还是替换字符,CharMatcher都能游刃有余。这里的关键是它提供了丰富的API来满足各种需求,让咱们能够精确控制字符串中的字符。

5.1 CharMatcher的基本原理

首先,咱们来聊聊CharMatcher的原理。CharMatcher是一个抽象类,提供了一系列静态方法来创建特定的匹配器。每个匹配器都是CharMatcher的一个实例,它可以用来匹配字符、一组字符或者符合某个条件的字符。一旦你有了一个CharMatcher实例,就可以对字符串执行各种操作,比如移除匹配的字符、保留匹配的字符,等等。

5.2 去除特定字符

假设咱们有一个字符串,需要去除其中的数字,CharMatcher就能派上用场。

String stringWithDigits = "hello123world456";
String noDigits = CharMatcher.inRange('0', '9').removeFrom(stringWithDigits);
System.out.println(noDigits); // 输出: helloworld
5.3 保留特定字符

相反地,如果咱们想要保留字符串中的数字,忽略其他字符,也很简单。

String stringWithLetters = "abc123xyz456";
String onlyDigits = CharMatcher.inRange('0', '9').retainFrom(stringWithLetters);
System.out.println(onlyDigits); // 输出: 123456
5.4 替换特定字符

CharMatcher还能用来替换特定的字符。比如,咱们想把所有的数字替换成星号。

String replaceDigits = CharMatcher.inRange('0', '9').replaceFrom(stringWithDigits, '*');
System.out.println(replaceDigits); // 输出: hello***world***
5.5 复合匹配器

有时候,咱们可能需要匹配多种条件的字符。Guava的CharMatcher提供了方法来组合多个匹配器,实现复合条件的匹配。

CharMatcher alphanumeric = CharMatcher.inRange('0', '9').or(CharMatcher.inRange('a', 'z'));
String mixedString = "abc123!@#xyz456";
String lettersAndDigits = alphanumeric.retainFrom(mixedString);
System.out.println(lettersAndDigits); // 输出: abc123xyz456
5.6 使用场景举例

CharMatcher的使用场景非常广泛。比如,咱们可能需要清理用户输入的数据,移除其中的特殊字符或空白。或者在处理日志文件时,保留特定格式的数据。CharMatcher就像是一个多功能的字符处理工具箱,能够轻松应对这些场景。

CharMatcher真的很强大,不仅仅是因为它能够执行各种字符操作,更因为它的使用方法简洁明了,能让咱们的代码更加清晰易懂。在处理字符串时,尤其是需要对字符串中的字符进行细粒度控制时,CharMatcher无疑是一个非常好的选择。

第6章:结合案例说明

咱们已经看到了Guava中Joiner、Splitter和CharMatcher的强大功能。现在,小黑来带大家看看这些工具是怎样在工作中发挥作用。通过一些实际的案例,咱们可以更好地理解这些工具的实用性和灵活性。

6.1 日志文件处理

想象一下,小黑正在处理一个日志文件,文件中记录了用户的活动,每条记录都由逗号分隔,但有些记录可能包含不必要的空白或错误格式的数据。这时候,咱们可以用Splitter和CharMatcher结合起来清理和解析这些数据。

String logEntry = "  user1, action:login , 2023-03-15 ";
// 使用Splitter分割日志条目
List<String> parts = Splitter.on(',')
    .trimResults() // 去除空白
    .omitEmptyStrings() // 忽略空字符串
    .splitToList(logEntry);

// 假设第三部分是日期,咱们想要去除非数字字符
String date = CharMatcher.inRange('0', '9').retainFrom(parts.get(2));
System.out.println(date); // 输出: 20230315
6.2 用户输入验证

再来看一个常见的场景:用户输入验证。假设小黑正在开发一个应用,需要用户输入电话号码。为了保证数据的准确性,需要从用户输入中移除所有非数字字符。

String userInput = "+1 (123) 456-7890";
// 只保留数字
String phoneNumber = CharMatcher.inRange('0', '9').retainFrom(userInput);
System.out.println(phoneNumber); // 输出: 11234567890
6.3 数据库查询结果格式化

最后一个例子,小黑想要格式化从数据库查询得到的一系列数据,这些数据需要以特定格式呈现给前端应用。

List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String formattedNames = Joiner.on('|').join(names);
System.out.println(formattedNames); // 输出: Alice|Bob|Charlie

Map<String, Integer> scores = new HashMap<>();
scores.put("Math", 90);
scores.put("English", 85);
String formattedScores = Joiner.on(',').withKeyValueSeparator(":").join(scores);
System.out.println(formattedScores); // 输出: Math:90,English:85

通过这些案例,咱们可以看出,Guava的字符串处理工具在实际开发中的应用是非常广泛的。它们不仅提高了代码的可读性和可维护性,而且在处理复杂的字符串操作时,显得尤为强大和灵活。特别是在需要精确控制字符串内容、格式化数据或清理用户输入等场景中,它们都是不可或缺的工具。所以,下次当你遇到字符串处理的任务时,不妨考虑一下Guava,它可能会给你带来意想不到的惊喜!

第7章:总结和建议

好了,经过前面的探索和学习,咱们对Guava中的Joiner、Splitter和CharMatcher有了深入的了解。在这一章节中,小黑想和大家分享一些总结和建议,帮助咱们更好地利用这些强大的工具。

7.1 为什么选择Guava的字符串处理工具

咱们来回顾一下为什么要选择Guava的字符串处理工具。最大的原因是它们的易用性和强大功能。在日常编程中,处理字符串是一项非常常见的任务。Guava的这些工具不仅简化了代码,提高了开发效率,而且使得代码更加清晰和易于维护。

  • Joiner 让字符串拼接变得异常简单,特别是在处理null值和复杂数据结构时。
  • Splitter 提供了灵活的字符串分割方式,可以处理各种复杂的分割需求。
  • CharMatcher 在字符级别上提供了极大的灵活性,无论是过滤、替换还是处理特定字符,都能轻松应对。
7.2 最佳实践和使用建议
  • 了解和掌握API:虽然这些工具的基本用法很简单,但它们还提供了许多高级功能。深入学习它们的API文档,可以帮助咱们发现更多的用法。
  • 合理应用于实际场景:在实际项目中,应当根据具体需求选择合适的工具。比如,处理大量数据时,使用Joiner和Splitter可以提高效率和代码可读性。
  • 注意性能考虑:虽然Guava的工具非常强大,但在性能敏感的场景下,还是需要考虑其性能影响。例如,在循环内部大量使用Splitter和Joiner可能会影响性能。
7.3 结语

通过这些章节的学习,咱们可以看到Guava提供的字符串处理工具不仅功能强大,而且使用方便。在实际编程中,它们可以帮助咱们解决许多字符串处理的难题,让代码变得更加简洁和优雅。希望通过这篇博客,大家能够更好地理解和使用这些工具,提高自己的编程效率和代码质量。

编程是一项既实用又有趣的技能,而Guava这样的工具库,就像是咱们工具箱里的瑞士军刀,总能在需要的时候派上大用场。继续探索,继续学习,咱们一起成长,一起写出更优秀的代码!

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

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

相关文章

Unity中Batching优化的GPU实例化(3)

文章目录 前言一、UNITY_SETUP_INSTANCE_ID(v);二、在UnityInstancing.cginc文件中&#xff0c;看一下Unity这句话做了什么1、使用了该 .cginc 后&#xff0c;会自动预定义该函数2、需要满足GPU实例化条件&#xff0c;才会执行对应语句3、满足GPU实例化后&#xff0c;主要执行的…

Python Tornado 框架的终极指南!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python Tornado框架是一个高性能的异步Web框架&#xff0c;被广泛应用于构建实时Web应用和API服务。本文将深度解析Tornado框架&#xff0c;介绍其核心概念、异步特性、路由系统、模板引擎以及WebSocket支持等方…

通过Powershell远程控制windows服务器

1、被测服务器5985、5986端口开启&#xff0c;在网络设置中&#xff0c;点击“更改连接属性”。 2、网络配置文件中选择“专用”。 3、以管理员权限运行Powershell&#xff0c; 4.通过powershell命令在本地电脑上添加远端信任主机 winrm set winrm/config/client {TrustedHos…

世微 AP3266 大功率同步降压恒流芯片 过EMC 车灯驱动

产品描述 AP3266 是高效率、外围简单、内置功率管的同步降压恒流芯片&#xff0c;适用于4-40V输入的降压LED恒流驱动芯片。输出最大功率可达 40W&#xff0c;最大电流3.6A。AP3266 可通过调节 OVP 端口的分压电阻&#xff0c;设定输出空载电压 保护&#xff0c;避免高压 空载上…

如何搭建一套完整的智能安防视频监控平台?关于设备与软件选型的几点建议

安防视频监控系统主要由前端摄像机设备、视频显示设备、视频存储设备、安防应用软件/平台以及其它传输、辅助类设备组成。一般来说&#xff0c;安防监控系统具有可扩展和开放性&#xff0c;以方便未来的扩展和与其他系统的集成。今天我们就来介绍一下&#xff0c;搭建一套完整的…

JAVA全栈开发 MySql详解

一、数据库 1.数据储存在哪里&#xff1f; 硬盘、网盘、U盘、光盘、内存&#xff08;临时存储&#xff09; 数据持久化 使用文件来进行存储&#xff0c;数据库也是一种文件&#xff0c;像excel &#xff0c;xml 这些都可以进行数据的存储&#xff0c;但大量数据操作&#x…

搜维尔科技:Varjo XR-4 系列-专为极致沉浸感而打造!

Varjo 的新一代头显将世界上最先进的混合现实技术与顶尖的图形处理能力连接起来&#xff0c;满足最高级别的视觉保真度和沉浸感至关重要的工业用例。 光学设计的根本性突破 体验全新的沉浸感。大幅扩展的视野&#xff0c;跨越 120 x 105 度&#xff0c;打破了受人尊敬的“全双眼…

跨域的多种方案详解

浏览器的同源策略是为了保护用户的安全&#xff0c;限制了跨域请求。同源策略要求请求的域名、协议和端口必须完全一致&#xff0c;只要有一个不同就会被认为是跨域请求。 本文列举了一些处理跨域请求的解决方案&#xff1a; JSONPCORS跨域资源共享http proxynginx反向代理web…

第七次作业

1&#xff0c; 给定一个包含n1个整数的数组nums&#xff0c;其数字在1到n之间&#xff08;包含1和n)&#xff0c;可知至少存在一个重复的整数&#xff0c;假设只有一个重复的整数&#xff0c;请找出这个重复的数 arr input("") num [int(n) for n in arr.split()]…

嵌入式板级系统设计【课设】

笔记【嵌入式板级系统设计】 前言版权笔记【嵌入式板级系统设计】资料学习面包板焊接注意焊接教程 焊接电路板基础代码GPIO 外部中断 定时中断 三合一串口 综合实验 风扇控制系统下板三合一窗口综合实验 最后 前言 2023-11-20 08:49:57 以下内容源自《【创作模板五】》 仅供学…

通过K8S安装人大金仓数据库

1. 离线下载镜像&#xff0c;请点击 2. 官网下载镜像 https://www.kingbase.com.cn/xzzx/index.htm&#xff0c;根据自己的需求下载对应版本。 3. K8S需要的yaml清单 cat > kingbase.yaml << EOF apiVersion: apps/v1 kind: Deployment metadata:name: kingbase-…

将图像增广应用于Mnist数据集

将图像增广应用于Mnist数据集 不用到cifar-10的原因是要下载好久。。我就直接用在Mnist上了&#xff0c;先学会用 首先我们得了解一下图像增广的基本内容&#xff0c;这是我的一张猫图片&#xff0c;以下为先导入需要的包和展示图片 import time import torch from torch im…

javaTCP协议实现一对一聊天

我们首先要完成服务端&#xff0c;不然出错&#xff0c;运行也要先运行服务端&#xff0c;如果不先连接服务端&#xff0c;就不监听&#xff0c;那客户端不知道连接谁 服务端 import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.Actio…

超越GPT-4!谷歌发布最强多模态大模型—Gemini

12月7日凌晨&#xff0c;谷歌在官网发布了全新最强多模态大模型——Gemini。 据悉&#xff0c;Gemini有Ultra、Pro、Nano三个版本&#xff0c;可自动生成文本、代码、总结内容等&#xff0c;并能理解图片、音频和视频内容。在MMLU、DROP 、HellaSwag、GSM8K等主流评测中&#…

JVM虚拟机(已整理,已废弃)

# JVM组成 ## 简述程序计数器 线程私有&#xff0c;内部保存class字节码的行号。用于记录正在执行的字节码指令的地址。 线程私有-每个线程都有自己的程序计数器PC&#xff0c;用于记录当前线程执行哪个行号 ## 简述堆 ## 简述虚拟机栈 ## 简述堆栈区别 ## 方法内局部变量是…

【前端架构】清洁前端架构

探索前端架构&#xff1a;概述与干净的前端架构相关的一些原则&#xff08;SOLID、KISS、DRY、DDD等&#xff09;。 在我之前的一篇帖子中&#xff0c;我谈到了Signals和仍然缺少的内容[1]。现在&#xff0c;我想谈谈一个更通用的主题&#xff0c;即Clean Frontend Architectu…

python+paddleocr 进行图像识别、找到文字在屏幕中的位置

目录 前言 1、安装paddleocr 2、安装PIL 3、安装numpy 4、 安装pyautogui 5、进行文本识别 6、识别结果 7、获取文字在图片/屏幕中的位置 8、pyautoguipaddleocr鼠标操作 9、完整代码 前言 最近在做自动化测试&#xff0c;因为是处理过的界面&#xff0c;所以使用pyw…

Vue3项目调用腾讯地图服务(地址解析 地址转坐标)及使用axios的跨域问题

一,需求 根据传入的文本地址 将其转换为坐标 显示地图点位在腾讯地图上 二,使用axios发送请求 import axios from axios; //引入axiosaxios({url:https://apis.map.qq.com/ws/geocoder/v1,method:get//参数 地址和key值}).then((data)>{console.log(data)});但是使用完报跨…

猫咪瘦弱的原因是什么?适合给消瘦猫咪长肉吃的猫罐头分享

很多小猫咪吃得很多&#xff0c;但是还是很瘦&#xff0c;这让很多猫主人感到困惑&#xff0c;猫咪瘦弱的原因是什么呢&#xff1f;铲屎那么多年&#xff0c;还是有点子养猫知识在身上的。那么&#xff0c;小猫咪瘦弱的原因是什么呢&#xff1f;让我们看看是不是这些原因导致的…

为什么有些程序员宁愿在国内 35 岁被辞退,也不愿意去国外工作?

我发现IT圈和电竞圈有一个共性&#xff1a;菜是原罪。 为什么有些程序员35岁就会被辞退&#xff1f;因为菜。 为什么有些程序员不愿意去国外工作&#xff1f;因为菜。 当然&#xff0c;我这里指的菜不是烂泥扶不上墙的那种菜&#xff0c;而是不够拔尖。那么这个问题也就分为了三…