我想实现一个接口,该接口允许我使用以下默认方法从任何集合创建地图:
default <T_KEY> Map<T_KEY, T_ELEM> toMap(final Function<T_ELEM, T_KEY> getKey)
getKey
返回给定T_ELEM
的映射键。应该这样称呼:
Map<String, String> values = ExtCollection.of(list).toMap(it -> it.substring(0, 3));
如何检索要解决的集合?
最佳答案
您的API ExtCollection.of(list).toMap
需要保留对集合的引用,因为您不能仅将其实现为接口。
这是带有普通类的实现:
public class ExtCollection<T_ELEM> {
private Collection<T_ELEM> collection;
private ExtCollection(Collection<T_ELEM> collection) {
this.collection = collection;
}
public static <T_ELEM> ExtCollection<T_ELEM> of(Collection<T_ELEM> collection){
return new ExtCollection<>(collection);
}
public <T_KEY> Map<T_KEY, T_ELEM> toMap(final Function<T_ELEM, T_KEY> getKey){
return collection.stream().collect(Collectors.toMap(getKey, Function.identity()));
}
}
另外,您可以扩展接口,但需要在
ExtCollection.of
方法内调用一个类。public interface ExtCollection<T_ELEM> extends Collection<T_ELEM> {
...
default <T_KEY> Map<T_KEY, T_ELEM> toMap(final Function<T_ELEM, T_KEY> getKey){
return stream().collect(Collectors.toMap(getKey, Function.identity()));
}
static<T_ELEM> ExtCollection<T_ELEM> of(Collection<T_ELEM> collection){
return new ExtCollection<T_ELEM>() {
...
};
}
}