Groovy检查列表是否含指定值时if条件判定失败问题排查
Groovy中字符串包含判定失败的问题排查
我来帮你分析一下问题所在——你这段Groovy代码的核心问题出在对result子列表的处理逻辑上,和Java的语法差异无关,是代码迁移时的逻辑误写。
先看你出问题的代码段:
for(int i =0; i<result.size(); i++){ List<String> text=new ArrayList<>(); text.add(result.get(i)+""); // 这里是关键错误! log.info text for (int j=0; j<text.size(); j++){ if(text.get(j).contains(needle)){ // ... 判定逻辑 } } }
问题原因
你提到result是包含两个子列表的列表(也就是List<List<String>>类型),但在代码里,你每次循环都新建了一个text列表,然后把整个子列表转成字符串(result.get(i)+"")添加进去。这会导致:
text永远只有1个元素,这个元素是子列表的字符串表示(比如类似["xxx", "UAN: 123", "yyy"]这样的字符串),而不是子列表里的单个字符串元素。- 你后续用
text.get(j).contains(needle)去匹配,本质是在搜索这个子列表的字符串形式里是否包含"UAN: 123",而不是搜索子列表中的元素,自然找不到目标值。
而你在Java中能正常运行,应该是因为Java代码里直接将result.get(i)(也就是子列表本身)赋值给了text,而不是把它转成字符串再添加到新列表里。
修正后的代码
只需要修改text的赋值逻辑,直接获取原有的子列表即可:
static void main(String args[]) { int count = 0; String needle = "UAN: 123"; for(int i = 0; i < result.size(); i++){ List<String> text = result.get(i); // 直接获取子列表,无需转字符串新建列表 log.info text for (int j = 0; j < text.size(); j++){ if(text.get(j).contains(needle)){ System.out.println("FOUND"); log.info "FOUND" count = j; System.out.println("THIS IS IT: " + text.get(count)); log.info text.get(count) } } } }
更简洁的Groovy写法
Groovy支持更优雅的遍历语法,完全可以抛弃传统的for循环,让代码更易读:
static void main(String args[]) { String needle = "UAN: 123"; int count = 0; result.eachWithIndex { subList, index -> log.info subList subList.eachWithIndex { item, itemIndex -> if (item.contains(needle)) { println "FOUND" log.info "FOUND" count = itemIndex println "THIS IS IT: ${item}" log.info item } } } }
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

