如何从List中传递Function<T, R>参数(而不是List)的应用

3
我有一个方法,它返回公司作为键和员工列表作为值:<T> Map<String,List<T>> getUserPerCompany(final Function<User, T> converter),该方法接受converter参数,在测试中,它会返回员工的名字和姓氏的字符串。它应该返回:Map<String, List<String>>。我创建了这个实现: return getUserStream().collect(toMap(Company::getName, c -> converter.apply(c.getUsers().stream().map(user -> user.getName() + " " + user.getLastname()).collect(Collectors.toList())))); 错误是:apply (domain.User) in Function cannot be applied to (java.util.List<domain.User>) 我的问题是,我不知道如何将“apply”方法传递给员工列表而不是完整的列表。
我的其他尝试:
  • return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().listIterator())));
  • return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().subList(0, c.getUsers().size()))));
  • return getUserStream().collect(toMap(Company::getName, c -> converter.apply((User) c.getUsers().iterator())));

2
没有读问题,但是标题中的“from List (not List)”不太清楚。 - davidxxx
2个回答

2
我想这就是你要找的内容。最初的回答为:

我想这就是你要找的内容。

<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());

基本上,您需要将每个User映射到应用输入Function
最初的回答。

2
非常感谢!我刚刚用getCompanyStream()替换了getUserStream()(公司包含用户),但这些是我的内部方法,不在这里。再次感谢您提供的解决方案,它很有效并且清晰易懂。 - pancake

0
您可以使用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;
                            }
                    )
            )
    ); 
}

1
Stream is lower than fori and foreach=> replace it use for - kozmo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接