我想实现一个接口,该接口允许我使用以下默认方法从任何集合创建地图:

    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>() {
            ...
        };
    }
}

10-07 16:20
查看更多