如何在 List(不是 List)的 Function<T, R> 参数中应用

How to apply in Function<T, R> argument from List (not List)

我有一个方法,其中 returns 公司作为键,员工列表作为值 <T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter)。 该方法接受 converter 参数,该参数在测试中 returns 字符串(员工的姓名 + 姓氏)。它应该 returns: Map<String, List<String>>。我创建了这个实现:

return getUserStream().collect(toMap(Company::getName, c -> converter.apply(c.getUsers())));

错误是: apply (domain.User) in Function cannot be applied to (java.util.List<domain.User>)

我的问题是我不知道如何将员工传递到 'apply' 列表而不是完整列表。

我的其他尝试:

我想这就是您要找的东西

<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
    return getUserStream().collect(Collectors.toMap(
            c -> c.getName(),
            c -> c.getUsers()
                  .stream()
                  .map(converter)
                  .collect(Collectors.toList())
    ));
}

用法示例是

final Map<String, List<String>> users = getUserPerCompany(user -> user.getName() + " " + user.getSurname());

基本上你需要 map 每个 User,应用输入 Function.

您可以使用 Collectors.groupingBy() 并编写自定义 Collector:

<T> Map<String, List<T>> getUserPerCompany(final Function<User, T> converter) {
    return getUserStream().collect(
            Collectors.groupingBy(
                    c -> c.getName(),
                    Collector.of(
                            ArrayList::new,                  //init accumulator
                            (list, c)-> c.getUsers()         //processing each element
                                         .stream()
                                         .map(converter)
                                         .forEach(list::add),
                            (result1, result2) -> {          //confluence 2 accumulators 
                                result1.addAll(result2);     //in parallel execution
                                return result1;
                            }
                    )
            )
    ); 
}