需求说明

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

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. Xpath基础学习

    方法 获取文本 a/text() 获取a标签下的文本 a//text() 获取a标签下所有标签的文本 a[text()='xxx']获取文本为xxx的a标签 @符号 a/@href 获取a标签的hre ...

  2. 从零开始的xxe学习

    本文介绍了一个菜鸡对xxe的一步步学习(内容多来源于大佬的博客,先感谢一波) 涉及知识点: (1)xxe 目录: 解析: 1.xxe是什么(不详解了,网上很多的) XXE(XML External E ...

  3. 关于svg格式问题

    背景介绍: 在使用photoswipe的时候,引入了css,按钮是使用svg进行展示的,在用vs2010开发调试过程中,发现不能显示按钮.在请求.svg 的文件时,响应头中的content Type始 ...

  4. springboot:异步调用@Async

    在后端开发中经常遇到一些耗时或者第三方系统调用的情况,我们知道Java程序一般的执行流程是顺序执行(不考虑多线程并发的情况),但是顺序执行的效率肯定是无法达到我们的预期的,这时就期望可以并行执行,常规 ...

  5. gnuplot添加直线和箭头

    http://blog.csdn.net/bill_chuang/article/details/18215051 6.在图中添加直线和箭头 gnuplot> set arrow from 0. ...

  6. 从面试角度分析ArrayList源码

    注:本系列文章中用到的jdk版本均为java8 ArrayList类图如下: ArrayList的底层是由数组实现的,数组的特点是固定大小,而ArrayList实现了动态扩容. ArrayList部分 ...

  7. mysql 查询 添加 删除 语句

    1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份数据的 d ...

  8. css精髓:这些布局你都学废了吗?

    前言 最近忙里偷闲,给自己加油充电的时候,发现自己脑海中布局这块非常的凌乱混杂,于是花了一些时间将一些常用的布局及其实现方法整理梳理了出来,在这里,分享给大家. 单列布局 单列布局是最常用的一种布局, ...

  9. 多任务-python实现-生成器相关(2.1.13)

    @ 目录 1.概念 2.创建方法 3.通过send方式来启动 1.概念 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占 ...

  10. python 批量压缩手机视频

    先安装ffmpeg pip install ffmpeg-python -i https://pypi.tuna.tsinghua.edu.cn/simple 下面是代码,新建video_compre ...