项目实战--Stream流实现字符串拼接


需求说明

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

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

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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM