需求说明

概述:前端页面查询列表中有个“二级类目”的多选下拉框,用户选择二级类目后,需要从后台数据库查询条件内的数据。 
目标:将前端页面传入后端的字符串例如"女性护理,美妆工具,口腔护理" 拼接为 ('女性护理','美妆工具','口腔护理')。

xxVo.java

/**
* 添加二级类目字段以及Getter和Setter方法
*/
private String secondCateNames; public String getSecondCateNames() {
return secondCateNames;
} public void setSecondCateNames(String secondCateNames) {
this.secondCateNames = secondCateNames;
}

Mapper.java

//二级类目查询
//方法一
if (StringUtils.isNoneBlank(vo.getSecondCateNames())) {
String[] strArr = vo.getSecondCateNames().split(",");
StringBuilder strBuilder = new StringBuilder();
for (int i = 0; i < strArr.length; i++) {
strBuilder.append("'").append(strArr[i]).append("'").append(",");
}
sql.append(" AND eod.second_cate_name in ("
+ strBuilder.substring(0, strBuilder.length()-1 ) + ")");
}
//方法二 运用Java8中的Stream表达式(推荐),告别For循环
if (StringUtils.isNotBlank(vo.getSecondCateNames())) {
//拼接前后单引号
String[] split = vo.getSecondCateNames().split(",");
List<String> secondCateNameList = Arrays.asList(split).stream().filter(Objects::nonNull)
.map(secondCateName -> "'" + secondCateName + "'").collect(Collectors.toList());
sql.append(" AND eod.second_cate_name in (")
.append(StringUtils.join(secondCateNameList, ",")).append(")");
}
 其中最后使用的StringUtils.join(final Iterable<?> iterable, final String separator)等价于使用
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix),该方法接受一个字符串序列作为拼接符,并在拼接完成后添加传递的前缀和后缀。
//方法一
sql.append(" AND eod.second_cate_name in (").append(StringUtils.join(secondCateNameList, ",")).append(")");
//方法二
sql.append(" AND eod.second_cate_name in ").append(secondCateNameList.stream().collect(Collectors.joining(",","(",")")));

实例DEMO

/**
* @author liao.wenhui
* @date 2019/7/15 10:49
* 目标是将"女性护理,美妆工具,口腔护理" -> ('女性护理','美妆工具','口腔护理')
*/
public class secondCateNameList {
public static void main(String[] args) {
//假设前端用户在多选框勾选后传入后端VO的二级类目字符串为secondCateNames
String secondCateNames = "女性护理,美妆工具,口腔护理"; //将字符串转换成数组,使用apache的StringUtils.split(string,char)
String[] split = StringUtils.splitString(secondCateNames,","); //使用Stream转换,过滤,用单引号进行拼接。
List<String> secondCateNameList = Arrays.asList(split).stream().filter(Objects::nonNull)
.map(secondCateName -> "'" + secondCateName + "'").collect(Collectors.toList());
System.out.println("secondCateNameList:"+secondCateNameList); //将集合转换成字符串
//方法一:join(Collection var0, String var1)
String a = StringUtils.join(secondCateNameList, ",");
System.out.println("AND eod.second_cate_name in("+ a + ")");
//方法二:joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
String b = secondCateNameList.stream().collect(Collectors.joining(",","(",")"));
System.out.println("AND eod.second_cate_name in"+ b);
}
}

如您对Java8中的Stream流不熟悉,可阅读博主--雨点的名字写的Java8 Stream

成长的速度,一定要超过父母老去的速度。

项目实战--Stream流实现字符串拼接的更多相关文章

  1. JDK8新特性---stream流

    项目上用到了stream流,找篇blog,转载一下,介绍下Stream流的用法. 1 流概述  流是 JDK8 新增的成员,允许以声明性方式处理数据集合,可以把 Stream 流看作是遍历数据集合的一 ...

  2. ASP.NET Core MVC中Controller的Action如何直接使用Response.Body的Stream流输出数据

    在ASP.NET Core MVC中,我们有时候需要在Controller的Action中直接输出数据到Response.Body这个Stream流中,例如如果我们要输出一个很大的文件到客户端浏览器让 ...

  3. 【慕课网实战】Spark Streaming实时流处理项目实战笔记十四之铭文升级版

    铭文一级: 第11章 Spark Streaming整合Flume&Kafka打造通用流处理基础 streaming.conf agent1.sources=avro-sourceagent1 ...

  4. 【慕课网实战】Spark Streaming实时流处理项目实战笔记二之铭文升级版

    铭文一级: 第二章:初识实时流处理 需求:统计主站每个(指定)课程访问的客户端.地域信息分布 地域:ip转换 Spark SQL项目实战 客户端:useragent获取 Hadoop基础课程 ==&g ...

  5. Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串

    Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso  向ByteArrayOutputStream这个流理想write字节..然后可以使 ...

  6. 在stream流和byte[]中查找(搜索)指定字符串

    在 stream流 和 byte[] 中查找(搜索)指定字符串 这里注重看的是两个 Search 的扩展方法,一个是 stream 类型的扩展,另一个是 byte[] 类型的扩展, 如果大家有更好的“ ...

  7. 【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何在网关上增加自定义客户端授权功能,从设计到编码实现,一步一步详细讲解,相信大家也掌握了自定义中间件的开发技巧了,本篇我们 ...

  8. mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)字符串拼接cancat实战例子

    mysql下的将多个字段名的值复制到另一个字段名中(批量更新数据)mysql字符串拼接cancat实战例子: mysql update set 多个字段相加,如果是数字相加可以直接用+号(注:hund ...

  9. 【慕课网实战】Spark Streaming实时流处理项目实战笔记二十一之铭文升级版

    铭文一级: DataV功能说明1)点击量分省排名/运营商访问占比 Spark SQL项目实战课程: 通过IP就能解析到省份.城市.运营商 2)浏览器访问占比/操作系统占比 Hadoop项目:userA ...

随机推荐

  1. [BJDCTF 2nd]Schrödinger && [BJDCTF2020]ZJCTF,不过如此

    [BJDCTF 2nd]Schrödinger 点进题目之后是一堆英文,英语不好就不配打CTF了吗(流泪) 复制这一堆英文去谷歌翻译的时候发现隐藏文字 移除test.php文件,访问test.php ...

  2. Mysql 存储过程(变量、定义条件、处理程序、光标、流程控制构造)

    最近由于有同事编写了存储函数,需要进行验证,但是对存储过程一直不是很了解,所以抽时间了解了一下存储过程的基本语法.本篇文章主要包括介绍了存储过程的5个小语法:declare语句的变量.定义条件.处理程 ...

  3. 转载 HTTP协议

    转载自:http://www.cnblogs.com/TankXiao/archive/2012/02/13/2342672.html 当今web程序的开发技术真是百家争鸣,ASP.NET, PHP, ...

  4. Ambari HDP集群搭建全攻略

    世界上最快的捷径,就是脚踏实地,本文已收录[架构技术专栏]关注这个喜欢分享的地方. 最近因为工作上需要重新用Ambari搭了一套Hadoop集群,就把搭建的过程记录了下来,也希望给有同样需求的小伙伴们 ...

  5. python 读取目录下的文件

    参考方法: import os path = r'C:\Users\Administrator\Desktop\file' for filename in os.listdir(path): prin ...

  6. 自己整理了一个 Dapper的Helper助手类

    链接字符串配置: <connectionStrings> <add name="db" connectionString="server=.;datab ...

  7. 团队作业part1--团队展示&选题

    一.团队展示 1.队名 DiligentVegetableChicken 2.队员信息 纪昂学(组长):3118005053 廖业成:3118005060 蔡越:3118005086 周梓波:3118 ...

  8. C++ 有关指针作为函数参数的问题,自定义内存分配函数传递二级指针的问题

    如题所示,我们主要讨论在自定义的内存分配函数中通常见到的代码如下所示: void Create(A** addr); 其中传递的参数是二级指针.为什么? 我们先看一下完整的动态内存分配函数的简单例子: ...

  9. STL——容器(Map & multimap)的大小

    1. Map & multimap 的大小 map.size();     //返回容器中元素的数目 map.empty();//判断容器是否为空, 容器中有内容将会返回 false 代码示例 ...

  10. RMAN迁移数据库(不改变文件目录)

    1.目标库创建相应目录mkdir -p /u01/app/oracle/oradata/orclmkdir -p /u01/app/oracle/fast_recovery_area/ORCLmkdi ...