Android中ArrayList.filter方法失效问题求助(适配API19)
嘿,我来帮你搞定这个问题~首先得搞清楚为什么你的parkingList.filter()没生效,然后再给你适配API19的替代方案:
为什么filter方法无效?
Java标准库的ArrayList本身并没有filter()方法,你可能想调用的是Java 8引入的Stream API里的filter()(写法是parkingList.stream().filter(...))。但问题来了:Stream API是从Android API 24才开始支持的,你的minSdk是19,直接用这个方法要么编译报错,要么运行时直接失效,这就是你遇到问题的核心原因!
适配API19,是不是只能用filter?当然不是!
给你推荐几个完全兼容API19的过滤方式,按需选择:
1. 手动遍历过滤(最稳妥,无依赖)
这是兼容性最好的方案,完全不依赖任何高版本API,逻辑也一目了然:
// 假设你的元素类型是Parking ArrayList<Parking> filteredList = new ArrayList<>(); for (Parking item : parkingList) { // 这里替换成你的过滤条件,比如判断停车场是否可用 if (item.isAvailable()) { filteredList.add(item); } }
写完直接用filteredList就是你要的结果,API19完美运行。
2. 用Kotlin的兼容写法(如果是Kotlin项目)
如果你的项目是用Kotlin开发的,只要引入了AndroidX的core-ktx依赖,直接调用parkingList.filter { ... }就可以——Kotlin标准库已经帮你做了低版本兼容,完全不用管API19的限制,写法简洁:
val filteredList = parkingList.filter { it.isAvailable() }
3. Guava库辅助过滤(Java项目可选)
要是Java项目想用上类似Stream的简洁写法,可以引入Guava库的Lists.filter()方法,它对API19友好。首先在build.gradle里添加依赖(选兼容Android的版本):
dependencies { implementation 'com.google.guava:guava:28.1-android' }
然后用法如下:
import com.google.common.collect.Lists; import com.google.common.base.Predicate; // 过滤列表 List<Parking> filteredList = Lists.filter(parkingList, new Predicate<Parking>() { @Override public boolean apply(Parking item) { return item.isAvailable(); // 你的过滤条件 } }); // 注意:Guava的filter返回的是原列表的视图,如果要不可变的新列表,转成ArrayList即可 ArrayList<Parking> immutableFilteredList = new ArrayList<>(filteredList);
总结
适配API19的话,手动遍历是最省心的选择,没有额外依赖;如果追求代码简洁,根据你的开发语言选Kotlin兼容写法或Guava库就行,完全不用局限于Stream的filter方法~
内容的提问来源于stack exchange,提问作者Arsen Saruhanyan

