需求说明

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

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. git相关操作

    git相关命令 基本操作 git init git add xxx git commit -m "first commit" git tag -a V1.0 -m '我的标签' g ...

  2. css3动画帧

    动画帧实现: css3使用steps来实现逐帧动画,动画过程中可能出现抖动,实乃精度偏差问题. 通常在动画里用到百分比单位时会出现抖动或位移现象,解决方法就是转换成具体的rem或px长度单位. 动画一 ...

  3. 微信小程序下拉加载下一页

    小程序做得多了,有些常用功能就有必要记录一下 请看详解: 微信小程序之下拉触底时加载下一页 wxml参考: <scroll-view class='dataContainer' scroll-y ...

  4. Springboot 项目 无法读取resources下的mapper文件夹的.xml文件

    之前学习的时候遇到的一个问题 org.springframework.beans.factory.BeanCreationException: Error creating bean with nam ...

  5. DRF框架笔记

    序列化器类的定义格式? 继承serializers.Serializer:字段 = serializers.字段类型(选项参数) 序列化器类的基本使用? 序列化器类(instance=None, da ...

  6. react第二十单元(react+react-router-dom+redux综合案例2)

    第二十单元(react+react-router-dom+redux综合案例2) #课程目标 #知识点 #授课思路 #案例和作业

  7. [日常摸鱼]HDU2157 How many ways??

    hhh我又开始水题目了 题意:给一张有向图,多次询问一个点到另一个点刚好走$k$步的方案数取模,点数很小 每个$a,b,k$的询问直接把邻接矩阵$map$自乘$k$次后$map[a][b]$就是答案了 ...

  8. kubeadm部署k8s

      Kubernetes技术已经成为了原生云技术的事实标准,它是目前基础软件领域最为热门的分布式调度和管理平台.于是,Kubernetes也几乎成了时下开发工程师和运维工程师必备的技能之一. 官方文档 ...

  9. python菜鸟教程学习:数据结构

    列表方法 list.append(x):把一个元素添加到列表的结尾,相当于 a[len(a):] = [x]. list.extend(L):通过添加指定列表的所有元素来扩充列表,相当于 a[len( ...

  10. PHP简单的计算位数的函数

    一个简单的PHP计算位数的函数: 1 <?php 2 //一个简单的计算字符串有长度的函数 3 #开始定义函数 4 function count_digit($number){ 5 $count ...