我尝试创建静态方法,该方法将实例字段的映射创建为键,并将实例本身创建为值。我尝试过这样的事情:
public static <T> Map<Object, T> collectionToMap(Collection<T> collection, Function<Object, T> fieldExtractor) {
return collection.stream()
.collect(Collectors.toMap(fieldExtractor, e -> e));
}
但是当我尝试传递一个函数作为参数时。我遇到了编译错误,因为getEmail()
方法不是静态的,但是toMap()
是静态的。
ProjectUtils.collectionToMap(collection, User::getEmail);
如何编写具有相似签名的静态方法并传递非静态方法引用?也许存在另一种方法可以做到这一点?
答案 0 :(得分:1)
首先像这样更改您的ProjectUtils
类。
public class ProjectUtils <T, S> {
public static <T, S> Map<S, T> collectionToMap(Collection<T> collection, Function<T, S> fieldExtractor) {
return collection.stream().collect(Collectors.toMap(fieldExtractor, Function.identity()));
}
}
然后客户端代码应该是这样的。
ProjectUtils.<User, String>collectionToMap(Collections.emptyList(), User::getEmail);