Android API21下如何将List<Person>转为含PersonName的List<String>
低API 21下实现属性提取的解决方案
没问题,我来帮你搞定这个低API版本的需求!因为API 21不支持Java 8的Stream和Collector,咱们用最基础的循环就能实现,逻辑反而更清晰直接。下面分两个需求逐一说明:
1. 收集对象数组的属性列表
假设你有一个Person类型的数组,想要提取每个元素的PersonName属性到一个列表中,只需要创建一个空列表,然后遍历数组逐个提取即可:
// 先定义Person类(示例) public class Person { private String personName; public Person(String personName) { this.personName = personName; } public String getPersonName() { return personName; } } // 提取数组属性的代码 Person[] personArray = {new Person("Alice"), new Person("Bob"), null, new Person("Charlie")}; List<String> nameList = new ArrayList<>(); for (Person person : personArray) { // *非常重要*:添加非空判断,避免空指针异常 if (person != null) { nameList.add(person.getPersonName()); } }
2. 将List转换为包含PersonName的List
这个需求和数组的处理逻辑几乎一致,只是遍历的是List集合:
List<Person> personList = new ArrayList<>(); personList.add(new Person("David")); personList.add(new Person("Eve")); personList.add(null); // 模拟可能的空元素 List<String> nameList = new ArrayList<>(); for (Person person : personList) { if (person != null) { nameList.add(person.getPersonName()); } }
可选:封装通用工具方法(兼容API21)
如果你需要多次提取不同属性,可以封装一个通用方法。注意API21支持Java 8的Lambda(Android 5.0及以上支持),如果项目允许使用Lambda,写法会更简洁;如果不行,用匿名内部类替代即可:
import java.util.ArrayList; import java.util.List; import java.util.function.Function; // 通用属性提取工具方法 public class CollectionUtils { public static <T, R> List<R> extractProperty(List<T> sourceList, Function<T, R> propertyGetter) { List<R> resultList = new ArrayList<>(); for (T item : sourceList) { if (item != null) { resultList.add(propertyGetter.apply(item)); } } return resultList; } } // 使用方式1:Lambda表达式(API21支持) List<String> names = CollectionUtils.extractProperty(personList, Person::getPersonName); // 使用方式2:匿名内部类(兼容所有API21场景) List<String> names = CollectionUtils.extractProperty(personList, new Function<Person, String>() { @Override public String apply(Person person) { return person.getPersonName(); } });
核心思路就是用传统的循环遍历集合/数组,逐个提取目标属性并添加到新集合中,非空判断一定要记得加,避免运行时的空指针异常。
内容的提问来源于stack exchange,提问作者Vahid H
相关产品推荐
相关产品推荐

