如何将包含字符串列表(内部列表)的对象列表转换为字符串列表

时间:2019-02-26 07:43:27

标签: java collections java-8 java-stream

我上过

public class RoleAccess {

    private String roleId;

    private List<String> apiIdList;

    public String getRoleId() {
        return roleId;
    }

    public void setRoleId(String roleId) {
        this.roleId = roleId;
    }

    public List<String> getApiIdList() {
        return apiIdList;
    }

    public void setApiIdList(List<String> apiIdList) {
        this.apiIdList = apiIdList;
    }

}

我想创建一个新列表,该列表将添加来自roleaccess的所有apiIdlist

List<String> apiIdList = new ArrayList<>();
for (RoleAccess roleAccess : roleAccessList) {
            if (roleAccess.getApiIdList() != null) {
                apiIdList.addAll(roleAccess.getApiIdList());
            }
        }

我们该如何使用流api或哪种最佳解决方案呢?

我检查了要列出的普通对象列表,但我想列出对象和内部列表 我尝试过

  List<String> apiIdList = roleAccessList.stream()
                          .map(RoleAccess::getApiIdList)
                          .collect(ArrayList::new, List::addAll, List::addAll);

3 个答案:

答案 0 :(得分:8)

使用try代替flatMap

map

请查看link,以获取有关List<String> apiIdList = roleAccessList.stream() .flatMap(e -> e.getApiIdList().stream()) .collect(Collectors.toList()); 的更多信息。

答案 1 :(得分:2)

List<String> apiIdList = roleAccessList.stream()
                       .map(RoleAccess::getApiIdList)
                       .filter(Objects::nonNull)
                       .flatMap(Collection::stream)
                       .collect(Collectors.toList());

答案 2 :(得分:0)

另一种解决方案是:

List<String> apiIdList = roleAccessList.stream()
        .flatMap(a -> a.getApiIdList().stream()) // flat map the apiIds from list
        .filter(Objects::nonNull) // use only not null
        .collect(Collectors.toList());