Java中如何更简便地创建子列表?含代码示例的技术问询
从已有列表创建子列表的简便方式
当然有啦!你现在的代码其实还存在一个小隐患——adreses初始化为null,直接调用add()方法会抛出空指针异常,得先初始化一个空列表才行。不过更简洁优雅的实现方式肯定是有的,尤其是Java 8及以上版本引入Stream API之后,这类对象转换+列表生成的操作变得非常顺手。
最推荐:Java 8+ 标准库 Stream API
这是无需额外依赖的最优解,代码简洁且可读性强:
public List<String> getAdreses(long personID) { return getContacts(personID) .stream() // 将原列表转为流 .map(Contact::getMail) // 把每个Contact对象映射为它的mail字段 .collect(Collectors.toList()); // 将流转回List集合 }
如果你的项目用的是Java 16及以上版本,还能再简化一步,直接调用Stream的toList()方法(生成的是不可变列表,若需要可变列表可以用Collectors.toCollection(ArrayList::new)):
public List<String> getAdreses(long personID) { return getContacts(personID) .stream() .map(Contact::getMail) .toList(); }
可选方案:Guava 工具类(若项目已引入Guava)
如果你的项目里已经在用Guava库,也可以用Lists.transform来实现,不过要注意它返回的是原列表的视图(原列表变化时子列表也会跟着变):
import com.google.common.collect.Lists; public List<String> getAdreses(long personID) { return Lists.transform(getContacts(personID), Contact::getMail); }
如果需要生成独立的、不可变的列表,可以再包装一层:
import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; public List<String> getAdreses(long personID) { return ImmutableList.copyOf(Lists.transform(getContacts(personID), Contact::getMail)); }
补充:修复你原有代码的小问题
如果暂时不想用Stream或第三方库,至少要把adreses初始化改为空列表,避免空指针:
public List<String> getAdreses(long personID) { List<String> adreses = new ArrayList<>(); // 初始化空列表 for(Contact mail : getContacts(personID)){ adreses.add(mail.getMail()); } return adreses; }
内容的提问来源于stack exchange,提问作者smok
相关产品推荐
相关产品推荐

