Android判断包名不含指定列表值的contains/Lambda逻辑失效问题求解
核心错误说明
你的代码逻辑不生效是两个本质问题导致的:
- 初始版本的
listOfNonApps.contains(pckName)是完整字符串相等匹配,但你列表里存的都是包名片段,不可能和完整包名完全相等,所以这个判断永远返回false,取反后永远会进入if分支。 - 后续所有Stream写法都搞反了
contains()的调用方向:你写的是列表元素.contains(pckName),本质是判断「短的预设关键词是否包含长的完整包名」,和你要的「完整包名是否包含预设关键词」逻辑完全相反,自然匹配结果全错。 - 部分Stream写法还叠加了取反逻辑错误、判断条件加多余取反的问题,进一步导致判断结果完全偏离预期。
正确实现代码
List<String> listOfNonApps = Arrays.asList(".google.", "com.android.", "lenovo", ".bing.",".amazon.",".microsoft.",".projectpapyrus.","com.lenovotab"); // 统一转小写避免大小写兼容问题,Android包名本身为小写,该步为严谨性补充 String lowerCasePkg = pckName.toLowerCase(); // 逻辑:包名不包含列表中任意一个关键词时,才进入分支执行逻辑 if (listOfNonApps.stream().noneMatch(keyword -> lowerCasePkg.contains(keyword))) { System.out.println("Not Found"); // 此处写你的后续业务逻辑 }
错误写法对照拆解
你之前尝试的Stream写法问题如下:
!listOfNonApps.stream().noneMatch(el -> el.toLowerCase().contains(pckName)):外层多余取反,且contains方向写反,等价于判断「存在关键词包含完整包名就进分支」,逻辑完全颠倒listOfNonApps.stream().noneMatch(el -> el.toLowerCase().contains(pckName)):contains方向写反,永远判断短关键词是否包含长包名,结果永远为true,所有包名都进分支listOfNonApps.stream().noneMatch(el -> !el.toLowerCase().contains(pckName)):判断条件加了多余取反,只要有一个关键词不包含完整包名就返回true,几乎所有情况都会进分支!listOfNonApps.stream().anyMatch(str -> str.contains(pckName)):contains方向写反,判断永远为false,取反后所有包名都进分支listOfNonApps.stream().anyMatch(str -> !str.contains(pckName)):判断条件多余取反+contains方向错误,只要有一个关键词不包含包名就进分支,几乎所有情况都满足
效果验证
用你给出的示例包名测试正确代码,结果完全符合需求:
com.google.android.apps.photos:包含.google.,不进入分支com.google.android.deskclock:包含.google.,不进入分支com.lenovotab.camera:包含com.lenovotab,不进入分支com.android.settings:包含com.android.,不进入分支com.dolby.daxappui2:不匹配列表任意关键词,正常进入分支
内容的提问来源于stack exchange,提问作者StealthRT
相关产品推荐
相关产品推荐

