You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:14:30