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

 更新时间:2021年08月17日 09:18:46   作者:灰灰Blog  
Java.lang.String是Java的字符串类. Srting是一个不可变对象,下面这篇文章主要给大家介绍了关于java实战小技巧之字符串与容器互转的相关资料,需要的朋友可以参考下

前言

每天一个实战小技巧:字符串与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

总结

到此这篇关于java实战小技巧之字符串与容器互转的文章就介绍到这了,更多相关java字符串与容器互转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot基于过滤器和内存实现重复请求拦截功能

    SpringBoot基于过滤器和内存实现重复请求拦截功能

    这篇文章主要介绍了SpringBoot基于过滤器和内存实现重复请求拦截,这里我们使用过滤器的方式对进入服务器的请求进行过滤操作,实现对相同客户端请求同一个接口的过滤,需要的朋友可以参考下
    2023-01-01
  • Springboot读取配置文件及自定义配置文件的方法

    Springboot读取配置文件及自定义配置文件的方法

    这篇文章主要介绍了Springboot读取配置文件及自定义配置文件的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java基础之Math和Random类知识总结

    Java基础之Math和Random类知识总结

    今天带大家来学习java的Math和Random类,文中有非常详细的代码示例及介绍,对正在学习java基础的小伙伴们很有帮助哟,需要的朋友可以参考下
    2021-05-05
  • Java反射机制详解

    Java反射机制详解

    Java的反射机制是在运行状态中,对于任何一个类,都可以知道这个类的所有属性和方法,对于任何一个对象,都可以调用它所有的方法和属性,修改部分类型信息,这种动态获取信息以及动态调用对象方法的功能称为Java的反射机制
    2022-09-09
  • spring boot 使用Aop通知打印控制器请求报文和返回报文问题

    spring boot 使用Aop通知打印控制器请求报文和返回报文问题

    这篇文章主要介绍了spring-boot 使用Aop通知打印控制器请求报文和返回报文,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-04-04
  • 详解Java网络编程

    详解Java网络编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。本文介绍了一些网络编程基础的概念,并用Java来实现TCP和UDP的Socket的编程,来让读者更好的了解其原理
    2021-06-06
  • java使用listIterator逆序arraylist示例分享

    java使用listIterator逆序arraylist示例分享

    对于列表而言,除了Iterator,还提供了一个功能更加强大的ListIterator。它可以实现逆序遍历列表中的元素。本示例将使用其逆序遍历ArrayList
    2014-02-02
  • mybatisplus自动填充属性值的实现步骤

    mybatisplus自动填充属性值的实现步骤

    MyBatis-Plus提供自动填充的功能,帮助自定设置这些字段的值,提升开发效率,本文就来介绍一下如何使用,感兴趣的可以了解一下
    2023-12-12
  • IntellJ idea使用FileWatch实时编译less文件的方法

    IntellJ idea使用FileWatch实时编译less文件的方法

    这篇文章主要介绍了IntellJ idea使用FileWatch实时编译less文件的相关资料,需要的朋友可以参考下
    2018-02-02
  • Springboot Websocket Stomp 消息订阅推送

    Springboot Websocket Stomp 消息订阅推送

    本文主要介绍了Springboot Websocket Stomp 消息订阅推送,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07

最新评论