Почему этот тест не работает для моей функции карты, как написано? - PullRequest
1 голос
/ 28 января 2020

Меня попросили создать тест для моей функции карты ниже.

static <U,V> List<V> map(Iterable<U> l, Function<U,V> f) {
    List<V> hashes = new ArrayList<>();

    for(U x : l) {
        V y = f.apply(x);
        hashes.add(y);
    }

    return hashes;
}

Тест, который я написал, берет список строк и создает список хэшей, который сравнивает сопоставленные хэши с хешами API. Функция hashCode ().

@Test
    public void testMap() {
        List<String> names = List.of("Mary", "Isla", "Sam");
        List<Integer> hashes = fp.map(names, hashCode());
        List<Integer> hashesComp = new ArrayList<>(); 

        for (String name : names) {
            int hash = name.hashCode();
            hashesComp.add(hash);
        }

        Assertions.assertEquals(hashesComp, hashes);
    }

Эта часть (в Eclipse)

List<Integer> hashes = fp.map(names, hashCode());

выдает мне ошибку:

The method map(Iterable<U>, 
 Function<U,V>) in the type fp is 
 not applicable for the arguments 
 (List<String>, int  

Что я делаю не так? Разве List не является итеративным, и дженерики должны принимать типы, которые я использую?

1 Ответ

3 голосов
/ 28 января 2020

Второй аргумент map метода должен быть Function. Выражение hashCode() не приводит к Function; он вызывает метод hashCode, который возвращает int. Следовательно, ваша ошибка в том, что int нельзя присвоить Function.

Я думаю, что вы хотите вызвать map с функцией, которая вычисляет hashCode каждой строки. Самый простой способ сделать это, передав ссылку на метод в String::hashCode:

List<Integer> hashes = fp.map(names, String::hashCode);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...