需求说明

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

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. python接口自动化测试框架(post提交添加变量)

    1.python接口测试框架包含哪几部分 数据源-> GET/POST 发送请求->接收返回结果->断言测试结果->生成测试报告(html报告)->网页报告 2.pyth ...

  2. hihocoder 1489(微软2017, 数学,模拟)

    题目链接:http://hihocoder.com/problemset/problem/1489?sid=1587434 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 ...

  3. Jenkins环境搭建(8)-邮件未能正常发送

    昨天,在使用jenkins构建项目时,出现了个问题,问题是:jenkins控制台日志显示邮件发送成功,但实际没有成功. 此前,jenkins的配置,项目构建后,是能正常发送邮件的,可这次突然就不行了, ...

  4. AcWing&#160;127.&#160;任务

    题目链接 参考y神的思路QWQ 算法:贪心 对于每一个任务: \(y\) 的差异最多能使利润\(w\)浮动\(2 * 100 = 200\)元. \(x\) 差\(1\),则会使利润\(w\)浮动\( ...

  5. asp.net-ajax使用-WebMethod使用

    1.js $.ajax({ type: "POST", contentType: "application/json", url: "activity ...

  6. 使用IDEA搭建SpringBoot进行增删改查

    功能环境:java1.8以上  .IntellJIDEA  First: 创建项目,请根据项目图一步一步完成建立. 二.配置数据库 三.创建实体对象建表或对应存在表,根据需要加入相应注解 四.创建应用 ...

  7. C 与 C++ 中 指向二维数组的指针进行指针运算

    二维数组在概念上是二维的,有行和列,但在内存中所有的数组元素都是连续排列的,它们之间没有"缝隙".以下面的二维数组 nums 为例: 从概念上理解,nums 的分布像一个矩阵,但在 ...

  8. Sql Server 数据把列根据指定的内容拆分数据

    今天由于工作需要,需要把数据把列根据指定的内容拆分数据 其中一条数据实例 select id , XXXX FROM BIZ_PAPER where  id ='4af210ec675927fa016 ...

  9. learn Docker from scratch (1)

    一.前言 Docker容器一个很有趣的东西,下面链接内容适合docker的入门非常棒! 链接如下: http://www.ruanyifeng.com/blog/2018/02/docker-tuto ...

  10. jmeter处理加密接口

    jmeter处理加密接口 普及知识点: 我们常见的加密方式有:(RSA .AES.MD5.secret) 如下四种情况: 1.请求加密.响应加密 2.请求不加密.响应加密 4.请求加密.响应不加密 5 ...