如何使用流转换Map值

How to convert Map value using stream

我有一个任务: Return 公司地图,其中键是其名称,值是存储为字符串的员工列表,由 firstNamelastName 组成,由 space 分隔。 这是我的解决方案,效果很好:

    Map<String, List<String>> getUserPerCompanyAsString() {
        return getCompanyStream()
                .collect(Collectors.toMap(Company::getName, company ->  getUserNames(company.getUsers())));
    }

    private List<String> getUserNames(List<User> users) {
        return users.stream()
                .map(user -> user.getFirstName() + " " + user.getLastName())
                .collect(Collectors.toList());
    }

public class Company {
    private final String name;
    private final List<User> users;
}

public class User {
    private final String firstName;
    private final String lastName;
    private final Sex sex;
    private final int age;
    private final List<Account> accounts;
    private final List<Permit> permits;
}

所以我的问题是,如何将 List<User> 作为映射值转换为 List<String>,其中 firstNamelastName 在一个流链中由 space 分隔而不辅助方法?

解决方案

感谢 Thomas 的建议,我可以在没有辅助方法的情况下解决这个问题:

    Map<String, List<String>> getUserPerCompanyAsString() {
        return getCompanyStream()
                .collect(Collectors.toMap(Company::getName, company -> company.getUsers().stream()
                                .map(user -> user.getFirstName() + " " + user.getLastName())
                                .collect(Collectors.toList())));

我知道您想使用辅助方法。 一种更简洁的方法是将 getUserNames 方法包含在 Company 中,这比将此逻辑挂在 Collector.

中更有意义

解决方案的可读性也会更高

Map<String, List<String>> getUserPerCompanyAsString() {
    return getCompanyStream().collect(
        Collectors.toMap(
            Company::getName,
            Company::getUserNames
        )
    );
}



public class Company {
    private final String name;
    private final List<User> users;

    // Constructor making sure users is not null

    private List<String> getUserNames() {
        return this.users
                   .stream()
                   .map(User::getFullName)
                   .collect(Collectors.toList());
    }
}

public class User {
    private final String firstName;
    private final String lastName;
    
    // Etc.

    public String getFullName() {
        return firstName + " " + lastName;
    }
}