首页 > 其他分享 >优雅提效:Guava的字符串处理工具

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

时间:2023-12-07 21:05:46浏览次数:32  
标签:Splitter Joiner String CharMatcher 优雅 字符串 提效 Guava out

第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这样的工具库,就像是咱们工具箱里的瑞士军刀,总能在需要的时候派上大用场。继续探索,继续学习,咱们一起成长,一起写出更优秀的代码!

标签:Splitter,Joiner,String,CharMatcher,优雅,字符串,提效,Guava,out
From: https://blog.51cto.com/u_16326109/8727601

相关文章

  • 【FreeRTOS】阻塞机制:任务调度的默契与优雅
    在实时操作系统(RTOS)的领域中,任务的协同合作和优雅调度是确保系统稳定性和高效性的关键因素之一。FreeRTOS作为一款广泛应用的RTOS,其阻塞机制提供了一种有力的工具,用于实现任务之间的协作与调度。本文将深入探讨FreeRTOS中的阻塞机制,介绍其概念、用法,并通过详细的代码演示来展示任务......
  • Guava本地环境设置
    Guava本地环境设置这部分指导如何下载和设置Java在机器上。请按照以下步骤来设置环境。JavaSE免费提供链接:下载Java。所以,根据操作系统下载对应版本。按照说明下载java和运行.exe在机器上,并按说明安装Java。一旦机器上安装了Java,还需要设置环境变量指向正确的JAVA安装目录:Wi......
  • 20 套监控平台统一成 1 套 Flashcat,国泰君安监控选型提效之路
    author:宋庆羽-国泰君安期货运维工作最重要的就是维护系统的稳定性,其中监控是保证系统稳定性很重要的一环。通过监控可以了解系统的运行状态,及时发现问题和系统隐患,有助于一线人员快速解决问题,提高业务系统的可用时长。作为国内头部期货公司,随着行业的发展,国泰君安期货的业务......
  • 并发设计类分析(Guava/Netty)
    1.限流器1.1限流器常见限流算法:计数器算法计数器算法是一种简单的限流方法,通过对请求进行计数,当请求达到一定的阈值时,进行限制。这种方法适用于简单场景,但不够灵活。容易出现临界时间点限流失效问题。滑动窗口算法滑动窗口算法维护一个时间窗口内的请求数量,通过动态调......
  • 故障发现、定位提效超 70%,去哪儿可观测体系做了哪些优化?
    一分钟精华速览去哪儿网的原有监控系统在指标数量上展现出了强大实力——上亿指标量和百万级的告警量,但在故障数据方面却稍显不足——订单类故障平均发现时间长达4分钟,仅有20%的订单类故障能在1分钟内被发现,近半数的故障处理时长超过30分钟。为了解决这些问题,去哪儿网决定从......
  • Guava中的函数式编程
    第1章:引言大家好!今天小黑要和咱们聊聊,在Java中使用Guava来进行函数式编程。首先,让我们来聊聊什么是函数式编程。简单来说,函数式编程是一种编程范式,它将计算视为函数的评估,避免使用程序状态和可变数据。在函数式编程中,函数是“一等公民”,意味着它们可以像任何其他数据一样被传递......
  • Guava Preconditions类的各种用法
    公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享。GuavaPreconditions类提供静态方法列表,用于检查是否使用有效参数值调用方法或构造函数。如果前提条件失败,则会抛出指定的异常。前置依赖引入pom<dependency><groupId>com.google.guava</g......
  • 深入探讨Guava的缓存机制
    第1章:引言大家好,我是小黑,今天咱们聊聊GoogleGuava的缓存机制。缓存在现代编程中的作用非常大,它能提高应用性能,减少数据库压力,简直就是性能优化的利器。而Guava提供的缓存功能,不仅强大而且使用起来非常灵活。在咱们深入挖掘之前,先简单说说缓存。缓存,其实就是一种保存数据的手段......
  • 使用 Guava Retry 优雅的实现重试机制
    王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人大家好,我是王有志。今天我会通过一个真实的项目改造案例和大家聊一聊如何优雅的实现Java中常用的的重试机制。业务背景在我们的系统中当客户完成支付后,保单管理系统会通过MQ推送出一条包......
  • 如何优雅的使用 Systemd 管理服务
    背景:我们在构建Kubernetes容器化平台时,会在节点上部署各种agent,虽然容器化当道的今天很多程序可以直接采用docker方式进行运行,但我们在整个集群内部仍然大量使用了 systemd 来管理基础服务。不过在使用过程中发现可能出现相关依赖的服务组件异常后导致节点上服务不可用......