记录个Java/Groovy的小问题:空字符串调用split函数返回非空数组
问题复现
最近写了一个groovy替换程序增量流水线脚本(会Java也能看懂),示意脚本如下:
//获取文件列表方法
def listFiles(folder) {
def output = sh(script: "ls ${folder}", returnStdout: true).trim()
return output.split('\n') as List
}
//调用以上方法获取lib目录下的需添加的jar列表
def addJars = listFiles("lib")
println "addJars值为"+addJars
//List判空
if(addJars != null && !addJars.isEmpty()){
println "addJars列表长度="+addJars.size()
for(addJar in addJars){
println "addJar="+addJar
}
}
最终输出结果:
addJars值为[]
addJars列表长度=1
addJar=
哎?我的判空没生效么?!
分析
ls 目录返回的字符串一般是\n文件1\n文件2\n这种格式的字符串,用\n分隔应该是没问题的。
继续分析output.split('\n') as List 这行,经过测试可以发现个现象:当output字符串为空字符串""时,这个split方法转换的数组/列表是带有一个空字符串元素的!
可简化此处代码进行测试:

这个split方法是groovy继承java的String类型的方法,用Java写代码也有这个问题:

所以说,split方法当字符串为空字符串时会返回带有空字符串元素的数组!
解决
- 方案1:split后判断数组长度为1,且首个元素为空字符串时,返回一个空数组/列表。
- 方案2:split返回的数组去除空字符串元素。
我的解法采用了方案2,同时用上了groovy的运算符重载:
def listFiles(folder) {
def output = sh(script: "ls ${folder}", returnStdout: true).trim()
def list = output.split('\n') as List
return list - ''
}
记录个Java/Groovy的小问题:空字符串调用split函数返回非空数组的更多相关文章
- 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数
不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...
- Java 的 String.split 函数,消除空字符串
代码: String str = "the music made it hard to concentrate"; String delims = "[ ]+" ...
- 给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式。 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向连接的对应模式。
这个是LeetCode上的一道题目.本机上运行时正确的,但是LeetCode上显示是错误的,所以没有办法了只能记录在博客上了. 我的想法是先把pattern和str都转化成数组.例如"abb ...
- Java开发:字符串切割split函数——切割符转码注意事项
一.问题如下: 1.先对一个已有字符串进行操作,使用 ; 进行分割: //示例字符串 String string="sr1.db1.tb1.df1;sr2.db2.tb2.d ...
- java面试题小全
面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面.抽象并不5. 打算了解全部问题,而6. 只是选择其中的 ...
- EXCEL小技巧:如何统计非空单元格
http://club.excelhome.net/thread-1187271-1-1.html 下面教大家如果用函数统计非空单元格的数量 首先我们来介绍几个统计函数: 1.COUNT(value1 ...
- java基础之----非空判断
大家好,第一次写博客,一直想写博客,用于自我总结,也用于帮助新同学成长. 平常我们开发的时候,用到很多非空判断,但是很多同学用到的地方不是很准确,这里,我把自己平时遇到的坑跟大家说说.我废话不多,只想 ...
- java:比赛中常用方法整理——字符串(基础)
一.将字符串转化为字符数组: toCharArray返回一个字符数组. char[] a=J.toCharArray(); 二.字符串的长度 字符串的长度和字符数组的长度是不一'样'的. 字符串长度( ...
- 异常分类和异常的产生过程解析和Objects非空判断
java.lang.Throwable类是java语言中所有错误的异常的超类. Exception:编译期异常,进行编译(写代码)java程序出现的问题 RuntimeExeption:运行期异常,j ...
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
随机推荐
- ClassFinal防JAVA代码反编译
亲测可用!不过项目暂停更新了. 传送地址:https://gitee.com/roseboy/classfinal#%E5%8A%A0%E5%AF%86
- Chrome 开启多线程下载
打开 chrome://flags/#enable-parallel-downloading,将 Parallel downloading 设置为 Enabled 参考:为什么Chrome浏览器下载速 ...
- 爬虫案例1-爬取图片的三种方式之一:DrissionPage篇(3)
@ 目录 前言 DrissionPage介绍 实战 共勉 博客 前言 继requests篇和selenium篇,本文是爬取图片的最后一个案例,利用了python第三方库DrissionPage来自动化 ...
- 【基础知识】【转】彻底搞懂 async & defer
普通 script 先来看一个普通的 script 标签. <script src="a.js"></script> 浏览器会做如下处理 停止解析 docu ...
- Angular Material 18+ 高级教程 – Get Started
前言 本编是 Angular Material 教程的开篇,我先介绍一下这个教程. 首先,Angular Material 教程不会像 Angular 教程那么注重原理,也很少会逛源码. 所以,如果你 ...
- Identity – Introduction & Scaffold
主要参考: Introduction to Identity on ASP.NET Core Start by command dotnet new webapp --auth Individual ...
- Tomcat——基本使用(下载、安装、卸载、启动、关闭)
Tomcat--基本使用 1.下载安装(8.5版本为企业最常用版本) 下载地址:https://tomcat.apache.org/download-80.cgi (官网 ...
- Word、Excel办公书的资源下载
我是清华社编辑,下载资源没有版权问题,可供读者个人学习用,但不允许商用. 微信扫描,清华社网盘,可转自己邮箱下载.安全,无风险. <Word/Excel/PPT 2019商务办公从入门到精通&g ...
- SpringCloud入门(四)Ribbon负载均衡
一.Ribbon负载均衡原理SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的. SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTempl ...
- Go语言对接微信支付与退款全流程指南
目录: 一.准备工作 二.初始化微信支付客户端 三.实现支付功能 1. 付款时序图 2. 实现不同场景下的支付 WAP端支付 PC端支付 Android端支付 3. 解析支付回调 四.实现退款功能 退 ...