Деформировать любую коллекцию в карту - PullRequest
0 голосов
/ 10 марта 2020

Я хочу реализовать интерфейс, который позволит мне создавать карту из любых коллекций следующим методом по умолчанию:

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

Как я могу получить коллекцию для обхода?

1 Ответ

0 голосов
/ 10 марта 2020

Ваш 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>() {
            ...
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...