java实战小技巧之字符串与容器互转详解

作者:灰灰Blog 时间:2023-09-04 10:56:01 

目录
  • 前言

  • I. 字符串转列表

    • 1. jdk支持方式

    • 2. guava方式

    • 3. apache-commons

  • II. 列表转字符串

    • 1. StringBuilder

    • 2. String.join

    • 3. gauva

  • III. 小结

    • 总结

      前言

      每天一个实战小技巧:字符串与Collection的互转

      将字符串转换为List,这种业务场景可以说非常非常常见了,实现方式也比较简单


      public List<String> str2list(String str, String split) {
         String[] cells = str.split(split);
         return Arrays.asList(cells);
      }

      那么除了上面这种实现方式之外,还有其他的么?

      I. 字符串转列表

      上面的实现姿势相当于字符串先转数组,然后在通过数组转列表,所以可以沿用前一篇字数组转list的几种方式

      1. jdk支持方式

      借助Collections.addAll来实现


      public List<String> str2list2(String str, String split) {
         List<String> list = new ArrayList<>();
         Collections.addAll(list, str.split(split));
         return list;
      }

      上面这种方式适用于输出String的列表,如果我希望转成int列表呢?可以采用下面的方式


      public List<Integer> str2intList(String str, String split) {
         return Stream.of(str.split(split))
                 .map(String::trim)
                 .filter(s -> !s.isEmpty())
                 .map(Integer::valueOf).collect(Collectors.toList());
      }

      直接将数组转换为流,然后基于jdk8的特性,来实现转换为int列表

      2. guava方式

      引入依赖


      <!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
      <dependency>
         <groupId>com.google.guava</groupId>
         <artifactId>guava</artifactId>
         <version>30.1-jre</version>
      </dependency>

      除了使用jdk原生的方式之外,借助guava也是非常常见的的case了,主要通过Splitter来实现,写法看起来非常秀


      public List<String> str2list2(String str, String split) {
         return Splitter.on(split).splitToList(str);
      }

      简单直接的一行代码搞定,如果我们希望是对输出的列表类型进行指定,也可以如下操作


      public List<Integer> str2intListV2(String str, String split) {
         return Splitter.on(split).splitToStream(str)
                 .map(String::trim).filter(s -> !s.isEmpty())
                 .map(Integer::valueOf).collect(Collectors.toList());
      }

      3. apache-commons

      引入依赖


      <dependency>
         <groupId>org.apache.commons</groupId>
         <artifactId>commons-collections4</artifactId>
         <version>4.4</version>
      </dependency>

      上面流的方式就很赞了,但是注意它是有jdk版本限制的,虽说现在基本上都是1.8以上的环境进行开发,但也不排除有上古的代码,比如我现在手上的项目,spring还是3…

      如果我们不能使用流的方式,那么有什么简单的方式来实现字符串转换为指定类型的列表么?


      public List<Integer> str2intListV3(String str, String split) {
         List<Integer> result = new ArrayList<>();
         CollectionUtils.collect(Arrays.asList(str.split(split)), new Transformer<String, Integer>() {
             @Override
             public Integer transform(String s) {
                 return Integer.valueOf(s);
             }
         }, result);
         return result;
      }

      上面这个实现也没有多优雅,不过这里有个编程小技巧可以学习,new Transformer(){}的传参方式,这种实现方式有点像回调的写法,虽然他们有本质的区别,此外就是jdk8之后的函数方法,就充分的体现这种设计思路,比如上面的换成jdk8的写法,直接简化为



      public List<Integer> str2intListV3(String str, String split) {
         List<Integer> result = new ArrayList<>();
         CollectionUtils.collect(Arrays.asList(str.split(split)), Integer::valueOf, result);
         return result;
      }

      II. 列表转字符串

      1. StringBuilder

      最容易想到的,直接使用StringBuilder来实现拼接


      public String list2str(List<String> list, String split) {
         StringBuilder builder = new StringBuilder();
         for (String str: list) {
             builder.append(str).append(split);
         }
         return builder.substring(0, builder.length() - 1);
      }

      注意两点:

      • 使用StringBuilder而不是StringBuffer (why?)

      • 注意最后一个拼接符号不要

      2. String.join

      一个更简单的实现方式如下


      public String list2str2(List<String> list, String split) {
         return String.join(split, list);
      }

      当然上面这个的缺点就是列表必须是字符串列表,如果换成int列表,则不行

      3. gauva

      guava也提供了列表转String的方式,同样很简单,而且还没有列表类型的限制


      public <T> String list2str3(List<T> list, String split) {
         return Joiner.on(split).join(list);
      }

      III. 小结

      本文的考题也非常常见,列表与字符串的互转,这里介绍了多种实现方式,有jdk原生的case(如果没有什么限制,推荐使用它, String.split除外,原因后面再说),如果有更高级的定制场景,如非String类型类表,则可以考虑guava的Splitter/Joinner来实现

      在上面的实现中,也提供了几种有意思的编程方式

      • Stream: 流,jdk8之后非常常见了

      • 函数方法,回调写法case

      来源:https://blog.hhui.top/hexblog/2021/08/11/210811-实战小技巧3:字符串与容器互转/

      标签:java,字符串,容器
      0
      投稿

      猜你喜欢

    • Java循环队列原理与用法详解

      2023-11-13 20:05:36
    • 为什么mybatis中的SqlSession一定要关闭

      2022-02-24 07:57:11
    • Java设计模式之建造者模式的示例详解

      2022-02-13 18:47:34
    • Netty分布式源码分析监听读事件

      2022-10-23 20:59:43
    • Java编程用两个栈实现队列代码分享

      2023-03-22 01:05:05
    • 如何利用反射生成 MyBatisPlus中QueryWrapper动态条件

      2021-10-20 14:59:40
    • 关于MyBatis结果映射的实例总结

      2022-02-21 02:31:31
    • SpringBoot2.0集成WebSocket实现后台向前端推送信息

      2023-08-22 18:50:39
    • Redis之GEO存储地理位置信息的使用

      2023-12-22 14:29:49
    • 基于C#实现的木马程序实例详解

      2023-02-25 20:05:03
    • Spring整合Springmvc的相关介绍

      2022-03-30 10:47:08
    • 解决Tomcat启动报异常java.lang.ClassNotFoundException问题

      2023-07-27 03:33:01
    • c#转义字符串中的所有正则特殊字符方法示例

      2021-06-23 12:05:21
    • HashSet和TreeSet使用方法的区别解析

      2022-05-03 12:54:05
    • Android使用系统自带的相机实现一键拍照功能

      2023-06-05 10:27:23
    • C#邮件定时群发工具Atilia用法实例

      2022-06-13 11:50:24
    • java 解决Eclipse挂掉问题的方法

      2023-02-19 14:05:55
    • mybatis 实体类字段大小写问题 字段获取不到值的解决

      2021-06-29 07:44:58
    • Android以对话框形式制作数字软键盘示例

      2022-12-07 07:37:03
    • Mybatis Lombok使用方法与复杂查询介绍

      2023-03-30 00:30:13
    • asp之家 软件编程 m.aspxhome.com